近日在工作中遇到需要从网络流量中抓取音频数据包,并生成音频文件的需求。之前对于音视频处理并没有接触过,在通过各种参差不齐的网络文章和中文维基百科后重新整理归纳。
首先,是基础理论的讲解。
音频
指人耳可以听到的声音频率在20Hz~20kHz之间的声波。
如果在计算机加上相应的音频卡—就是我们经常说的声卡,我们可以把所有的声音录制下来,声音的声学特性如音的高低等都可以用计算机硬盘文件的方式储存下来。反过来,我们也可以把储存下来的音频文件用一定的音频程序播放,还原以前录下的声音。
1 音频文件格式
音频文件格式专指存放音频数据的文件的格式。存在多种不同的格式。
一般获取音频数据的方法是:采用固定的时间间隔,对音频电压采样(量化),并将结果以某种分辨率(例如:CDDA每个采样为16比特或2字节)存储。采样的时间间隔可以有不同的标准,如CDDA采用每秒44100次;DVD采用每秒48000或96000次。因此,[采样率],[分辨率]和[声道]数目(例如立体声为2声道)是音频文件格式的关键参数。
1.1 有损和无损
根据数字音频的产生过程可知,相对自然界的信号,音频编码最多只能做到无限接近,至少目前的技术只能这样了,任何数字音频编码方案都是有损的,因为无法完全还原。在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV 文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准。
有两类主要的音频文件格式:
- 无损格式,例如WAV,PCM,TTA,FLAC,AU,APE,TAK,WavPack(WV)
- 有损格式,例如MP3,Windows Media Audio(WMA),Ogg Vorbis(OGG),AAC
2 参数介绍
2.1 采样率
指每秒钟取得声音样本的次数。声音其实是一种能量波,因此也有频率和振幅的特征,频率对应于时间轴线,振幅对应于电平轴线。波是无限光滑的,弦线可以看成由无数点组成,由于存储空间是相对有限的,数字编码过程中,必须对弦线的点进行采样。
采样的过程就是抽取某点的频率值,很显然,在一秒中内抽取的点越多,获取得频率信息更丰富,为了复原波形,采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多。由于人耳的分辨率很有限,太高的频率并不能分辨出来。22050 的采样频率是常用的,44100已是CD音质,超过48000或96000的采样对人耳已经没有意义。这和电影的每秒24帧图片的道理差不多。如果是双声道(stereo),采样就是双份的,文件也差不多要大一倍。
根据奈奎斯特采样理论,为了保证声音不失真,采样频率应该在40kHz左右。这个定理怎么得来,我们不需要知道,只需知道这个定理告诉我们,如果我们要精确的记录一个信号,我们的采样频率必须大于等于音频信号的最大频率的两倍,记住,是最大频率。
在数字音频领域,常用的采样率有:
- 8000 Hz - 电话所用采样率, 对于人的说话已经足够
- 11025 Hz - 电话所用采样率
- 22050 Hz - 无线电广播所用采样率
- 32000 Hz - miniDV 数码视频 camcorder、DAT (LP mode)所用采样率
- 44100 Hz - 音频 CD, 也常用于 MPEG-1 音频(VCD, SVCD,MP3)所用采样率
- 47250 Hz - 商用 PCM 录音机所用采样率
- 48000 Hz - miniDV、数字电视、DVD、DAT、电影和专业音频所用的数字声音所用采样率
- 50000 Hz - 商用数字录音机所用采样率
- 96000 Hz或者 192000 Hz - DVD-Audio、一些 LPCM DVD 音轨、BD-ROM(蓝光盘)音轨、和 HD-DVD (高清晰度 DVD)音轨所用所用采样率
2.2 采样位数
采样位数也叫采样大小或量化位数。它是用来衡量声音波动变化的一个参数,也就是声卡的分辨率或可以理解为声卡处理声音的解析度。它的数值越大,分辨率也就越高,录制和回放的声音就越真实。而声卡的位是指声卡在采集和播放声音文件时所使用数字声音信号的二进制位数,声卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。常见的声卡主要有8位和16位两种,如今市面上所有的主流产品都是16位及以上的声卡。
每个采样数据记录的是振幅, 采样精度取决于采样位数的大小:
- 1 字节(也就是8bit) 只能记录 256 个数, 也就是只能将振幅划分成 256 个等级;
- 2 字节(也就是16bit) 可以细到 65536 个数, 这已是 CD 标准了;
- 4 字节(也就是32bit) 能把振幅细分到 4294967296 个等级, 实在是没必要了.
2.3 通道数
即声音的通道的数目。常见的单声道和立体声(双声道),现在发展到了四声环绕(四声道)和5.1声道。
2.3.1 单声道
单声道是比较原始的声音复制形式,早期的声卡采用的比较普遍。单声道的声音只能使用一个扬声器发声,有的也处理成两个扬声器输出同一个声道的声音,当通过两个扬声器回放单声道信息的时候,我们可以明显感觉到声音是从两个音箱中间传递到我们耳朵里的,无法判断声源的具体位置。
2.3.2 立体声
双声道就是有两个声音通道,其原理是人们听到声音时可以根据左耳和右耳对声音相位差来判断声源的具体位置。声音在录制过程中被分配到两个独立的声道,从而达到了很好的声音定位效果。这种技术在音乐欣赏中显得尤为有用,听众可以清晰地分辨出各种乐器来自的方向,从而使音乐更富想象力,更加接近于临场感受。
双声目前最常用途与两个,在卡拉OK中,一个是奏乐,一个是歌手的声音;在VCD中,一个是普通话配音,一个是粤语配音。
2.3.3 四声环绕
四声道环绕规定了前左、前右,后左、后右四个发声点,听众则被包围在这中间。同时还建议增加一个低音音箱,以加强对低频信号的回放处理(这也就是如今4.1声道音箱系统广泛流行的原因)。就整体效果而言,四声道系统可以为听众带来来自多个不同方向的声音环绕,可以获得身临各种不同环境的听觉感受,给用户以全新的体验。如今四声道技术已经广泛融入于各类中高档声卡的设计中,成为未来发展的主流趋势。
2.3.4 5.1声道
5.1声道已广泛运用于各类传统影院和家庭影院中,一些比较知名的声音录制压缩格式,譬如杜比AC-3(Dolby Digital)、DTS等都是以5.1声音系统为技术蓝本的,其中“.1”声道,则是一个专门设计的超低音声道,这一声道可以产生频响范围20~120Hz的超低音。其实5.1声音系统来源于4.1环绕,不同之处在于它增加了一个中置单元。这个中置单元负责传送低于80Hz的声音信号,在欣赏影片时有利于加强人声,把对话集中在整个声场的中部,以增加整体效果。
目前很多在线音乐播放器,比如说QQ音乐,已经提供5.1声道音乐试听和下载。
2.4 帧
音频的帧的概念没有视频帧那么清晰,几乎所有视频编码格式都可以简单的认为一帧就是编码后的一副图像。但音频帧跟编码格式相关,它是各个编码标准自己实现的。
-
如以PCM(未经编码的音频数据)来说,它根本就不需要帧的概念,根据采样率和采样精度就可以播放了。比如采样率为44.1kHZ,采样精度为16位的双音频,你可以算出比特率是44100162bps,每秒的音频数据是固定的44100162/8 字节。
-
amr帧比较简单,它规定每20ms的音频是一帧,每一帧音频都是独立的,有可能采用不同的编码算法以及不同的编码参数。
-
mp3帧较为复杂一点,包含了更多的信息,比如采样率,比特率,等各种参数。
2.5 周期
音频设备一次处理所需要的帧数,对于音频设备的数据访问以及音频数据的存储,都是以此为单位。
2.6 交错模式
数字音频信号存储的方式。数据以连续帧的方式存放,即首先记录帧1的左声道样本和右声道样本,再开始帧2的记录。
2.7 非交错模式
首先记录的是一个周期内所有帧的左声道样本,再记录所有右声道样本。
2.8 比特率(码率)
比特率也叫码率,指音乐每秒播放的数据量,单位用bit表示,也就是二进制位。 bps就是比特率。b就是比特(bit),s就是秒(second),p就是每(per),一个字节相当于8个二进制位。也就是说128bps的4分钟的歌曲的文件大小是这样计算的(128/8)460=3840kB=3.8MB,1B(Byte)=8b(bit),一般mp3在128比特率左右为益,也大概在3-4 BM左右的大小。
在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的 WAV文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。
要算一个PCM音频流的码率是一件很轻松的事情,采样率值×采样大小值×声道数 bps。一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率则为 44.1K×16×2 =1411.2Kbps。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。
双声道的PCM编码的音频信号,1秒钟需要176.4KB的空间,1分钟则约为10.34M,这对大部分用户是不可接受的,尤其是喜欢在电脑上听音乐的朋友,要降低磁盘占用,只有2种方法,降低采样指标或者压缩。降低采样指标是不可取的,因此专家们研发了各种压缩方案。最原始的有DPCM、ADPCM,其中最出名的为MP3。所以,采用了数据压缩以后的码率远小于原始码。
2.9 示例计算
譬如 “Windows XP 启动.wav” 的文件长度是 424,644 字节, 它是 “22050HZ / 16bit / 立体声” 格式。
那么它的每秒的传输速率(位速, 也叫比特率、取样率)是 22050162 = 705600(bps), 换算成字节单位就是 705600/8 = 88200(字节/秒), 播放时间:424644(总字节数) / 88200(每秒字节数) ≈ 4.8145578(秒)。
但是这还不够精确, 包装标准的 PCM 格式的 WAVE 文件(*.wav
)中至少带有 42 个字节的头信息, 在计算播放时间时应该将其去掉, 所以就有:(424644-42) / (22050162/8) ≈ 4.8140816(秒). 这样就比较精确了.
3 PCM音频编码
PCM 即脉冲编码调制 (Pulse Code Modulation)。在PCM 过程中,将输入的模拟信号进行采样、量化和编码,用二进制进行编码的数来代表模拟信号的幅度 ;接收端再将这些编码还原为原来的模拟信号。即数字音频的 A/D 转换包括三个过程 :采样,量化,编码。 [1]
话音PCM的采用率为8kHz,采样位数为8bit,故话音数字编码信号的码率为8bits×8kHz=64kbps = 8KB/s。
3.1 音频编码原理
有一定电子基础的都知道传感器采集音频信号是模拟量,而我们实际传输过程中使用的是数字量。而这就涉及到模拟转数字的过程。而模拟信号须经过三个过程,即抽样、量化和编码,以实现话音数字化的脉冲编码调制(PCM,Pulse Coding Modulation)技术。
3.1.1 抽样
抽样是把模拟信号以其信号带宽2倍以上(来奎斯特采样定理)的频率提取样值(采样率),变为在时间轴上离散的抽样信号的过程。
采样率:每秒从连续信号中提取并组成离散信号的采样个数,用赫兹(Hz)来表示。
sample:
如音频信号采样率为8000hz。
可以理解上图采样对应图中 那段电压随时间变化的曲线 为1秒 那下面那个1 2 3 …10那就因该有1-8000个点,即将1秒均分为8000份,依次取出来那8000个点时间 对应的电压值。
3.1.2 量化
抽样信号虽然是时间轴上离散的信号,但仍然是模拟信号,其样值在一定的取值范围内,可有无限多个值。必须采用“四舍五入”的方法把样值分级“取整”,使一定取值范围内的样值由无限多个值变为有限个值。这一过程称为量化。
采样位数:指的是描述数字信号所使用的位数。
8位(8bit)代表2的8次方=256,16 位(16bit)则代表2的16次方=65536;
sample:
如音频传感器采集到的电压范围为0-3.3V,采样位数为8bit(位)
即我们把3.3V/ 2^8 = 0.0128 即为量化精度。
我们把3.3v分成0.0128为步进的Y轴,如图3中的1 2 …8就变成了0 0.0128 0.0256 ……3.3 V
比如某个采样点的电压值为1.652V(1280.128 与 1290.128之间) 我们对它四舍五入就为1.65V 对应 量化等级为128 。
3.1.3 编码
量化后的抽样信号就转化为按抽样时序排列的一串十进制数字码流,即十进制数字信号。简单高效的数据系统是二进制码系统,因此,应将十进制数字代码变换成二进制编码。根据十进制数字代码的总个数,可以确定所需二进制编码的位数,即字长(采样位数)。这种把量化的抽样信号变换成给定字长的二进制码流的 过程称为编码。
sample:
接着上面的1.65V 对应 量化等级为128 。对应的2进制为10000000 。即该采样点编码后结果为10000000 。当然这是没有考虑正负值情况下的编码方式,而且编码方式种类非常多,需要具体问题具体分析。(PCM音频格式编码为A律13折线编码)
3.2 PCM音频编码
PCM信号未经过任何编码和压缩处理(无损压缩)。与模拟信号比,它不易受传送系统的杂波及失真的影响。动态范围宽,可得到音质相当好的效果。
3.2.1 PCM编码
编码上采用了的是A律13折线编码。
具体可参考:PCM语音编码
3.2.2 声道
声道可以分为单声道和立体声(双声道)。
PCM的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需的最小字节数。
样本大小 | 数据格式 | 最小值 | 最大值 |
---|---|---|---|
8位PCM | unsigned int | 0 | 225 |
16位PCM | int | -32767 | 32767 |
采样位数为8位时:
- 单声道声音文件,采样数据为八位的短整数(short int 00H-FFH)采样数据按时间的先后顺序依次存入。
- 双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位(左声道)和低八位(右声道)分别代表两个声道,采样数据按时间先后顺序交叉地存入。
采样位数为16位时同理,存储的时候与字节序有关。big-endian模式具体如图所示:
所有网络协议都是采用big endian的方式来传输数据的。所以也把big endian方式称之为网络字节序。当两台采用不同字节序的主机通信时,在发送数据之前都必须经过字节序的转换成为网络字节序后再进行传输。
4 G.711
在一般的PCM中,模拟信号在数字化之前会经过一些处理(如幅度压缩)。一旦经数字化,PCM信号通常会再进一步处理(如数字资料压缩)。
G.711,是一种对来自ITU-T的脉冲编码进行调制的标准多媒体数字信号(压缩/解压缩)运算法则,是一种对模拟信号数字化的取样技术,特别是对于音频信号。PCM 对信号每秒钟取样 8000 次,8KHz;每次取样为 8 个位,总共64Kbps(DS0)。取样等级的编码有二种标准,北美洲及日本使用 Mu-Law 标准,而其它大多数国家使用 A-Law 标准。
A律和u律,是PCM的两种编码方式,A律PCM用于欧洲和我国,Mu律用于北美和日本。两者的差异在于量化的方式不同,A律使用12bits量化,u律使用13bits量化,取样频率皆为8KHz,皆为8bits的编码方式。
简单理解:PCM是音频设备采集过来的原始音频数据, G.711和 AAC 是两种不同的算法, 可以对PCM数据进行一定比例的压缩, 从而实现再网络传输中节省带宽。