打开cubase后播放为什么有爆音的情况出现?

[版权声明] 本站所有资料由用户提供并上传,若内容存在侵权,请联系邮箱。资料中的图片、字体、音乐等需版权方额外授权,请谨慎使用。网站中党政主题相关内容(国旗、国徽、党徽)仅限个人学习分享使用,禁止广告使用和商用。

}

前七章不仅了解了音视频的基础概念,还在Android和iOS平台完成了两个比较完整的应用,一个是视频播放器的应用,一个是视频录制应用,所以可以把前七章称之为基础篇或者说是入门篇。而从现在开始,将进入一个新的篇幅——提高篇,这部分内容旨在为基础篇中完成的两个应用添加一些必要的功能(比如添加音频滤镜、视频滤镜),做一些性能优化(比如硬件解码器的使用),实现一些公共基础库的抽象与构建(音频处理、视频处理的公共库)等。

本章将学习音频处理相关的知识,在第1章已介绍过一些音频背景与相关的基础知识,本章会在此基础上进行更加深入的讲解。此外,一些基本的乐理知识也会在本章中进行介绍与讲解。让我们马上开始吧!



当上面这一行命令执行结束之后,进入sox-code目录,可以看到仓库的源代码已经全部被下载下来了,接下来的工作就是将源码编译成为二进制命令行工具。先查看源码目录下面的INSTALL文件,这个文件中指明了如果要编译的源(即代码仓库)是使用git下载的源码,则要先执行如下命令:

这个命令执行完毕之后,会在源码目录下生成configure、install-sh等文件,由于我们要编译最基本的Sox的二进制命令行工具出来,所以应建立一个shell脚本config_pc.sh,键入以下代码:

然后给config_pc.sh以及configure增加执行权限,并在源码目录下面,新建pc_lib目录,最终执行这个shell脚本文件:

当这个shell脚本执行结束之后,代表配置结束,接下来就可以执行安装命令了:

执行成功之后,进入到pc_lib目录下,可以看到这个目录里被安装脚本生成了bin、lib、include等目录,各个目录的作用本书中已经讲过很多遍了。进入bin目录,可以看到play、rec、sox等二进制文件,其中,sox就是我们要运行的二进制命令行工具了,而play则可以在处理的同时直接播放一个音频文件,类似于FFmpeg中的ffplay工具,至于rec,则是录制声音的工具。由于我们在config_pc.sh中关闭了硬件设备的配置选项,所以play和record工具不能使用,我们只使用sox来处理音频文件,输入是wav格式的音频文件,输出也是wav格式的音频文件。那我们就使用sox这个二进制命令行工具,对一个输入文件分别完成前面提到的三种效果器。

首先是均衡效果器,在前面已讲过均衡器的设置,整个参数分为N组参数,每一组参数代表对具体频率的增强或者减弱,每一组参数中包括频率、频带宽度、增益,sox的均衡器参数设置中也是一样的,来看下面这条命令:

上面这条命令前两个参数分别代表输入文件和输出文件,它们后面有两个均衡器,第一个均衡器在89.5Hz作为中心频率,频带宽度为1.5q(具体Q值代表的意义,在之前的章节中已经提到过),增加5.8dB的能量;第二个均衡器是在中心频率为120Hz,频带宽度为2.0q,减少5dB的能量。如果想再给声音多作用几个均衡器,在后面依次再写上几组就可以了。待执行完命令之后,可以听一下输出文件的效果,或者使用Audacity软件打开处理前和处理后的音频文件,使用频谱图来观察一下处理前后的频谱分布的变化。

其次是压缩效果器,在前面也讲过压缩器的设置,整个参数包括门限值、压缩比、Attack Time、Decay Time等,sox中的压缩效果器使用库中的compand来实现,先来看一下命令:

前两个参数依次是输入文件和输出文件,后面的compand代表的是效果器的名称,在sox中使用compand效果器来实现压缩-扩展器(Compressor-Expander),后面的参数以空格分开,首先是0.3和1,分别代表了Attack Time和Decay Time,至于它们所代表的含义前面已经介绍过了,接下来的一组参数代表了压缩器的转换函数表,每个数值的单位都是dB,稍后会详细解释这一条曲线,继续来看下面三个参数分别是0,-100,0.1,第一个0代表的是增益,即压缩完毕之后可以给一个整体增益作用到输出上,这里就不给任何增益了,第二个-100代表的初始音量,可以设置成为-100dB,代表初始音量从一个几乎为静音的音量开始,最后的0.1是延迟量。在实际的音频处理场景中,压缩器对于声音的忽然升高有很好的抑制作用。

现在来看一下由压缩器转换函数表绘制出的一个压缩曲线,如图8-28所示。

在图8-18中,红色直线为一条斜率为1的直线,实际上就是不作任何处理时的曲线,而蓝色曲线就是我们的压缩曲线。整个蓝色曲线分为四部分,可以看到在能量比较低的部分(-100dB到-80dB)将输出能量降低,相当于底部噪声部分给压低了;在中间能量部分(-75dB到-45dB)有所提升;而接下来一部分(-40dB到-25dB)我们保持不动,可以看到蓝色曲线和红色曲线重合;在接下来比较高能量部分(-20dB到0dB)再进行压缩处理,就形成了整个曲线。当然,输入输出点数越多,曲线就会画得越平滑,处理得到的声音效果也会越好。大家可以听一下经过压缩器处理完毕的声音,是不是整个音量的动态变化范围被压缩了呢?而这也就是压缩效果器的作用。

最后是混响效果器,对于混响器的参数之前也详细的介绍过了,直接来看如何使用sox给一个声音增加混响:

第一个参数是reverbrance即余响的大小,先设置为50听听效果,第二个参数是HF-damping即高频阻尼,设置为50,第三个参数是room-scale即房间大小,这里设置为90,代表一个比较大的房间,第四个参数代表立体声深度,设置越大则代表立体声效果越明显,这里设置为50,最后一个参数是pre-delay即早反射声的时间,单位是毫秒,这里设置为30毫秒。执行完以上命令,读者听一下处理完的声音,会发现有一个比较明显的混响效果了。

这里介绍了如何编译Sox,以及使用Sox这个二进制命令行工具,下面会把它交叉编译到Android平台,并且介绍它的SDK的使用。

这里会将Sox交叉编译到Android平台,并且介绍如何在Andorid平台使用Sox的SDK来使库中的效果器工作。首先,要将Sox这个开源库交差编译出一个静态库以及头文件,以方便我们在Android的NDK开发的编译阶段和链接阶段分别引用。新建立config_armv7a.sh,键入以下代码,来编译出静态库与头文件:

然后执行config_armv7a.sh(如果没有执行权限,要加上执行权限),最终可以看到在当前目录里的lib目录下有一个armv7的目录,armv7目录中会有我们非常熟悉的include、lib目录,里面就是我们需要的头文件sox.h与静态库文件libsox.a,至此交叉编译工作就完成了,接下来就来看看如何使用Sox库中提供的API在代码层面使用各种效果器。

要使用Sox库中提供的API,就要从它的官方实例中开始,在Sox的根目录下进入到src目录下,在src目录下有几个以example开头的C文件,这就是提供给开发者参考的使用Demo。打开example0.c这个文件,首先可以看到,在这个文件的开头引用了sox.h这个头文件,然后再来看一下main函数,因为主要使用API的流程都是在main函数中,所以下面逐步看一下。在使用sox这个库之前,必须初始化整个库的一些全局参数,需要调用如下代码:

上述函数返回一个整数,如果返回的是SOX_SUCCESS这个枚举值,则代表初始化成功了。在整个应用程序中,如果没有调用sox_quit方法,是不可以再一次调用sox_init,否则会造成Crash。接下来初始化输入文件,代码如下:

初始化好了输入文件之后,再来初始化输出文件,代码如下:

这样就初始化好了输出文件,可以看到输入和输出文件都是wav格式的,因为我们并没有集成其他编码格式的工具,所以就是直接用的wav格式。下面来使用效果器,Sox中提供的效果器种类比较多,为了方便开发者使用,Sox使用类似责任链设计模式的方式来设计整个系统,所以我们使用的时候需要先构造一个效果器链出来,然后将需要使用的效果器一个一个地加到这个链里面,最终传入输入文件中数据以及接受这个效果器链处理完的数据,就可以完成音效的处理工作了,所以首先我们先来构造这个效果器链:

上述代码就构造出了一个效果器链,重点来看一下里面的两个参数,这两个参数实际上就是告诉效果器链输入音频的数据格式和输出音频的数据格式,比如声道、采样率、表示格式等。而我们从最开始初始化的输入文件格式和输出文件格式中可以拿到数据格式,sox会存储到encoding这个属性中。接下来就需要向效果器链中增加效果器了,但是在增加实际的效果器之前,我们需要先考虑一个问题,就是如何将输入音频数据提供给效果器链,以及如何将效果器链处理完的音频数据写到文件中去。对于这个问题,其实Sox已经帮我们提供了对应的API,为了方便开发者,sox的作者把输入和输出分别构造成了一个特殊的效果器,待我们创建出提供输入数据的效果器之后,需要添加到效果器链的第一个位置;然后创建出输出数据的效果器,添加到效果器链的最后一个位置上。

下面首先来看一下为效果器链提供输入数据的特殊效果器的构造:

上述代码就构造出了一个用于给效果器链输入数据的特殊效果器,但是具体这个特殊效果器的数据从哪里来呢?答案就是我们上面初始化的输入文件,所以我们要将输入文件配置到这个效果器中,代码如下:

可以看到上述代码将之前构造的输入文件格式的结构体强制转化为char指针类型的参数,并配置给了效果器,其实在sox中都是以char指针类型的参数,来配置效果器的。配置好了之后,要将这个效果器增加到效果器链中,并且将这个效果器释放掉,代码如下:

至此我们给效果器链提供输入数据的特殊效果器就已经创建成功,并且进行了配置,最终成功的添加到了效果器链中,而这个过程也是任何一个效果器从创建到配置到添加到销毁的整个过程。

接下来就是我们想要使用的最核心的效果器部分了,这里以一个非常简单的增加音量的效果器作为讲解,在接下来的章节中会依次针对本章中重点介绍的三个效果器进行讲解,音量调整效果器添加代码如下:

可以看到,使用这个音量效果器给整个音频文件增加3个dB的音量,整个过程也比较简单,但是有的读者会问到,若想使用一个效果器,从哪里可以找到这个效果器的名称呢?其实所有的效果器的名称都被定义在effects.h这个头文件中,读者可以自己去查阅。

接下来配置另外一个比较特殊的效果器,即接受效果器链处理完的数据,并将数据输出到文件中的效果器,代码如下:

上述代码也比较简单,主要是把我们前面所构造的输出文件配置给output这个特殊效果器,最终再将效果器添加到整个效果器链中。至此我们这个效果器链就已经构造好了,整个结构如图8-29所示。

当构造好了这个效果器链,如何让整个效果器链运行起来呢?其实也很简单,只需要执行以下代码:

这个方法执行结束,其实整个处理流程也就结束了,经过我们核心效果器——声音变化效果器处理之后的音频数据就被全部写入到output.wav这个文件中了,当然,完成之后还是要销毁掉这个效果器链:

然后需要关闭掉输入和输出文件:

最后需要释放掉sox这个库里面的全局参数,代码如下:

至此我们就可以使用sox提供的SDK来处理音频文件了,大家可以熟悉一下,下面会继续讲解本章中的最重要的三个混音效果器在sox中的使用。

下面来使用sox的均衡器,其实在前面已经介绍过命令行工具中如何使用均衡效果器,有了前面的基础,我们也基本上可以猜测出本节的代码如何来书写,代码如下:

首先根据均衡器的名字创建出效果器,然后使用中心频率、频带宽度,以及增益来配置这个效果器,代码如下:

由于均衡器的参数有3个,所以这里配置参数的第二个参数传递3,待执行完这个配置函数之后,返回的ret是SOX_SUCCESS则代表配置成功。最后将这个效果器添加到效果器链中,代码如下:

至此,就将一个均衡器加入到我们的效果器链中了,但是一般情况下会有多个均衡器同时作用到音频上,如果有多个则创建多个均衡器,依次添加到效果器链中。

均衡效果器就讲解完毕了,但是一般情况下我们在处理音频的时候,还会加上高通和低通,类似于均衡器,都属于滤波器。高通就是高频率的声音可以通过这个滤波器,低频的声音就被过滤掉了,有另外一种叫法就是低切。低通就是高通的逆过程,也被称之为高切。这里只展示高通滤波器,代码如下:

相对比与普通的均衡器,高通滤波器不需要增益这个参数,所以只需要这两个参数就够了,低通效果器的名字是【lowpass】。

在sox库中对于均衡器的具体实现是biquad(源码文件是biquads.c),而biquad也是大部分均衡器以及高通、低通等的实现方式。Biquad又称为双二阶滤波器,双二阶滤波器是双二阶(两个极点和两个零点)的IIR滤波器,它可以不用将声音转换到频域而给声音做频域上的某一些处。至此均衡器的所有内容就讲解完毕了,接下来会讲解压缩效果器。

这里介绍如何使用sox中的压缩器,压缩效果器前面已经讲解得比较多了,所以我们就直接上代码,首先创建出压缩效果器:

然后给这个压缩器配置参数,下面挨个介绍一下,首先是作用时间与释放时间,代码如下:

然后是压缩比,在sox中用了更灵活的压缩曲线来控制压缩比,使用的是构造一个函数转换表的方式来实现,代码如下:

最后是整体增益、初始化音量以及延迟时间,代码如下:

构造方这一些参数之后,利用这一些参数配置一下这个压缩效果器,代码如下:

最终将这个效果器加入到效果器链中,并销毁这个效果器,代码如下:

大家尝试着运行一下,最终拿出处理完毕的音频文件,进行播放,感受一下在代码层面使用SDK调用压缩效果器处理的音频是否和命令行工具处理出来的音频一致。

下面介绍如何使用sox的混响器,有了之前效果器的经验,我们首先创建出混响效果器,代码如下:

然后给这个混响效果器配置参数,混响效果器的参数比较多,下面来一一介绍,首先是是否纯湿声的参数:

然后是混响大小、高频阻尼以及房间大小:

最后是立体声深度、早反射声时间以及湿声增益:

将这一些参数一块配置到效果器中,代码如下:

最终将这个效果器加入到效果器链中,并运行程序。大家可以试听一下处理之后的音频效果,其实在使用混响效果器的时候,一般在混响效果器之前增加一个echo效果器往往可以获得比较好的效果,大家可以尝试着增加一下,由于篇幅的关系,这里就不再赘述了。

在sox库中Reverb使用经典的施罗德(Schroeder)混响模型来实现,施罗德(Schroeder)混响模型使用4个并联的梳状滤波器和2个串联的全通滤波器来建立混响模型。梳状滤波器提供了混响效果中延迟较长的回声,而延时较短的全通滤波器则起到了增加反射声波密度的作用,如图8-30所示:

那现在我们就来分析一下施罗德混响模型的优缺点,优点是,通过设置六个滤波器的参数,可以模仿出前期反射和后期混响效果,全通滤波器可以在一定程度上减轻梳状滤波器引入的渲染成分;缺点是产生的混响效果缺少早期反射声,这样会造成声音缺乏空间立体感而且不清晰。对于它的缺点我们可以去进行改造和优化,其中大家最为常用的一种手段就是使用干声的echo来填充早期的反射声,改造后结构如图8-31所示:

如图8-31所示,在混响中一定要将isWetOnly属性设置为True,即只要湿声,然后使用Echo来填充早起反射声部分,所以将湿声与Echo加起来之后,作为混响的湿声部分,然后在与干声以一定的干湿比混合起来作为最终的输出结果。

至此在Android平台上的效果器实现已经讲解完毕了,读者可以把sox里面的效果器都玩一遍试试效果,说不定哪一个效果器在你以后的工作场景下会用到。特别的说明,这一些效果器都是以C语言书写的,所以理论上是通过交叉编译就可以运行在iOS平台上,但是iOS平台的多媒体库非常强大,是否有更高效的处理方式呢?下一节就介绍iOS平台上如何使用更高效的方式来完成音频处理。

相比较于Android的开发者来说,iOS平台上的开发者应该感到非常幸运,因为苹果已经为开发者提供了足够强大的多媒体方面的API,所以我们的原则是首先来看iOS平台本身的音频处理API都有什么,能否满足我们的效果器实现。查阅开发者文档中不难得出,使用AudioUnit是可以来处理音频的,而这个结论在第4章中就有提到过,此外,还提到过AudioUnit有多种类型,其中有一种类型就是EffectType的AudioUnit,所以我们就来看一下如何使用AudioUnit来实现本章中提到的三种效果器。

下面使用AudioUnit来实现均衡器,在AudioUnit中对于均衡器有两种类型的实现,第一种实现是叫做ParametricEQ的实现,这种类型均衡器的设置非常类似于sox中的均衡效果器,如果想要给声音多个均衡器,则需要增加多个此类型的效果器。第二种实现是叫做NBandEQ,从名字上来看,这种均衡器可以同时对多个频带进行设置,不用为了对多频带进行调整而添加多个效果器。在实际的生产过程中,笔者常用的是NBandEQ,读者应该根据自己的场景来选择具体的均衡效果器,在这里分别进行介绍一下这两种类型的AudioUnit的使用,还是按照之前AUGraph的方式来使用。我们使用这两种实现方式实现同一个需求,完成给3个中心频率的增加或减少能量。

先来看一下它的描述,类型是Effect的类型,子类型就是ParametricEQ,厂商肯定都是Apple,代码如下:

然后按照这个描述将均衡器AUNode加入到AUGraph中,并且根据这个AUNode取出这个效果器对应的AudioUnit,代码如下:

根据之前章节中讲述的AudioUnit配置过程,来给这个效果器配置参数,至于均衡器的参数有哪一些分别代表了什么意义,前面已经讲解得非常清楚了,所以这里就直接上代码了:

注意,配置频带的参数不是Q值也不是以O(Octave八度)为单位的,而是以Hz为单位,中心频率的设置以及增益的设置都是和之前一致的。配置好参数之后,就将这个效果器连接到数据源(RemoteIO或者Audio File Player),然后可以去试听一下效果或者将数据保存下来。

先来看一下它的描述,类型是Effect类型,子类型为NBandEQ,代码如下:

从名字上也可以看出,所谓的NBandEQ,其实这一个效果器就可以满足为多个频带增强或者减弱能量的需求,在这里不再展示构造AUNode以及从具体的AUNode中获取出AudioUnit的代码,而是直接把设置参数的代码展示如下:

乍一看可能会觉得这里的参数怎么多。下面就逐一来解释一下各个参数的含义,首先是NBandEQ,要想给哪一个Band设置就直接在某一个参数后面加几即可,第一项设置是选择EQ类型,其中EQ类型包括高通、低通、带通等,这里选择的就是Parametric类型的普通EQ;而第二项参数就是Bypass的设置,也就是是否直接通过而不做任何处理,0代表这个不对这个频带不作处理,1代表对这个频带进行处理;剩余的三个参数是前面讲过的,但是需要注意的是,BandWidth设置的单位是O(Octave,八度),所以如果你的频宽单位是Q值的话,这里要进行一下转换。

接着可以将这个效果器以AUNode的形式连接到数据源(RemoteIO或者Audio File Player)后面,然后可以去试听效果以及生成处理后的音频文件。

下面使用AudioUnit来实现压缩器,相比上一节的均衡器,压缩器的设置可以说是比较简单的,首先来看一下压缩器的描述,类型就是Effect类型,而子类型是DynamicProcessor,代码如下:

之后就是给这个AudioUnit来设置参数了,代码如下:

这里的参数比较简单,和之前介绍的压缩器参数是一致的,主要是有门限值、压缩比、作用时间和释放时间等。

最后将这个效果器连接到数据源AudioUnit的后面,然后可以试听效果,如果满意最终可以试着生成一个目标音频文件。

下面使用AudioUnit来实现混响器,代码如下:

这里利用这个描述构造出AUNode,并且取出对应的AudioUnit,代码如下:

然后就是设置参数了,代码如下:

这里的参数和前面大部分的混响设置也差不多,大家可以自己调试各项参数,分别来设置参数试听效果。设置好参数之后,可以将这个混响器连接到数据源之后,并试听效果,如果满意最终可以试着生成一个目标音频文件。

至此,本章的内容就全部结束了,本章内容比较多,从数字音频的表示形式,到基本乐理知识,以及到最后各种效果器的介绍以及实践,读者可以依据自己工作中的需求逐一去学习和应用。

本章从声音的时域、频域表示开始进行讲解,并且讲解了FFT的物理意义,掌握这一些基本的表示对于数字音频的理解是很有帮助的;然后讲解到了一些基本的乐理知识,掌握这一些乐理知识之后相信读者对于声音的理解可以达到一个更高层次的理解;最后介绍了混音效果器,在8.4和8.5小结从各个效果器的原理以及实现进行了分析,并且在各自平台的优化策略也做出了总结。本章内容比较多,读者可以慢慢阅读,深入理解。

}

我要回帖

更多关于 cubase5缓存256有爆音 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信