音频基本概念
简介
声音的三要素
声音的三要素:频率、振幅、波形
频率:声波的频率,即声音的音调,人类听觉的频率(音调) 范围为 20Hz—20KHz
振幅:即声波的响度,通俗的讲就是声音的高低,一般男生的声音振幅(响度) 大于女生。
波形:波形决定了其所代表声音的音色。音色不同是因为它们的介质所产生的波形不同。
声音的本质:音调、音量、音色
音调:频率(音频的快慢)
音量:振幅(振动的幅度)
音色:与材质有关,谐波(不规则的正弦波):除了基波之后,剩下与基波进行叠加的波
几个基本的概念:
比特率:表示经过编码(压缩)后的音频数据每秒钟需要用多少个比特来表示,单位常为 kbps。
响度和强度:声音的主观属性响度表示的是一个声音听来有多响的程度。响度主要随声音的强度而变化,但也受频率的影响。总的说,中频纯音听来比低频和高频纯音响一些。
采样和采样率:采样是把连续的时间信号,变成离散的数字信号。采样率是指每秒钟采集多少个样本。
奈奎斯特采样定律:Nyquist 采样率大于或等于连续信号最高频率分量的 2 倍时,采样信号可以用来完美重构原始连续信号。
数字音频
采样
所谓的采样就是只在时间轴上对信号进行数字化。根据奈奎斯特定律(也称作采样定律) ,按照比声音最高频率的 2 倍以上进行采样。
人类听觉的频率(音调) 范围为 20Hz–20KHz。所以至少要大于 40KHz。
采样频率一般为 44.1kHz,这样可保证声音达到 20kHz 也能被数字化。
44.1kHz 就是代表 1 秒会采样 44100 次。
量化
具体每个采样又该如何表示呢?这就涉及到量化。量化是指在幅度轴上对信号进行数字化。如果用 16 比特位的二进制信号来表示一个采样,那么一个采样所表示的范围即为 [-32768, 32767] 。
模数转换:
- 实际的声波:模拟量,是连续不断的。
- 计算机声波:数字量,是离散的点。
模拟 ——> 数字: 关键就是量化 ,量化的关键又是 采样
编码
每一个量化都是一个采样,将这么多采样进行存储就叫做编码。
所谓编码,就是按照一定的格式记录采样和量化后的数字数据,比如顺序存储或者压缩存储等等。
通常所说的音频裸数据格式就是**脉冲编码调制(PCM)**数据。
描述一段 PCM 数据通常需要以下几个概念:量化格式(位深, 通常 16bit) 、采样率、声道数
对于声音格式,还有一个概念用来描述它的大小,即比特率,即 1 秒内的比特数目,用来衡量音频数据单位时间内的容量大小。
注意:
- 计算机当中的格式是二进制,但是这里的格式是十进制,所以要进行转换。
- 二进制的方波就可以应用到电路当中
- 计算机当中没有小数点,将十进制扩大10倍,就可以消除一个小数点。
- 十进制的扩大范围与位深有关
概念:
- 位深(采样大小):表述 采样数值 的最大范围。8位(0-255) 16位(0-65535)
- 采样率:8k、16k、32k、44.1k、48k。 (一秒钟采样的次数)
- 声道数:单声道、双声道、多声道。 (几个通道进行采样)
音频处理基础
噪声抑制
设备采集的原始声音往往包含了背景噪声,影响听众的主观体验,降低音频压缩效率。
WebRTC:可以对白噪声和有色噪声进行良好的抑制,满足视频或者语音通话的要求。
** Speex:**该算法适用范围较 Webrtc 的噪声抑制算法更加广泛,可以在任意采样率下使用。
回声消除
在视频或者音频通话过程中,本地的声音传输到对端播放之后,声音会被对端的麦克风采集,混合着对端人声一起传输到本地播放,这样本地播放的声音包含了本地原来采集的声音,造成主观感觉听到了自己的回声。
自动增益控制
手机等设备采集的音频数据往往有时候响度偏高或者响度偏低,造成声音忽大忽小,影响听众的主观感受。
自动增益控制算法根据预先配置的参数对输入声音进行正向/负向调节,使得输出的声音适宜人耳的主观感受。
静音检测
静音检测的基本原理:计算音频的功率谱密度,如果功率谱密度小于阈值则认为是静音,否则认为是声音。静音检测广泛应用于音频编码、AGC、AECM 等。
舒适噪声产生
舒适噪声产生的基本原理:根据噪声的功率谱密度,人为构造噪声。
广泛适用于音频编解码器。
它的应用场景:完全静音时,为了创造舒适的通话体验,在音频后处理阶段添加随机白噪声。
音频开发的具体内容:
- 音频采集/播放;
- 音频算法处理(去噪、VAD 检测、回声消除、音效处理、功放/增强、混音/分离, 等等);
- 音频的编解码和格式转换;
- 音频传输协议的开发(SIP, A2DP、 AVRCP, 等等);
常见音频格式
**WAV **:压缩率低
MIDI(Musical Instrument Digital Interface):又称作乐器数字接口, 是数字音乐/电子合成乐器的统一国际标准
MP3(MPEG-1 Audio Layer 3):MP3 能够以高音质、低采样率对数字音频文件进行压缩。应用最普遍
MP3Pro:MP3Pro 可以在基本不改变文件大小的情况下改善原先的 MP3 音乐音质。它能够在用较低的比特率压缩音频文件的情况下,最大程度地保持压缩前的音质。
WMA (Windows Media Audio):WMA 格式是以减少数据流量但保持音质的方法来达到更高的压缩率目的, 其压缩率一般可以达到 1:18
RealAudio:最大的特点就是可以实时传输音频信息,尤其是在网速较慢的情况下,仍然可以较为流畅地传送数据,因此 RealAudio 主要适用于网络上的在线播放
Audible:拥有四种不同的格式: Audible1、2、3、4。格式 1、2 和 3采用不同级别的语音压缩,而格式 4 采用更低的采样率和 MP3 相同的解码方式,所得到语音吐辞更清楚,而且可以更有效地从网上进行下载
AAC:高级音频编码的缩写,AAC 的音频算法在压缩能力上远远超过了以前的一些压缩算法(比如 MP3 等)。它还同时支持多达 48 个音轨、15 个低频音轨、更多种采样率和比特率、多种语言的兼容能力、更高的解码效率。 总之,AAC 可以在比 MP3 文件缩小 30% 的前提下提供更好的音质。
Ogg Vorbis:它是完全免费 、开放和没有专利限制的,同样位速率(Bit Rate)编码的 OGG 与 MP3 相比听起来更好一些
APE:是一种无损压缩音频格式,在音质不降低的前提下,大小压缩到传统无损格式WAV 文件的一半
FLAC(Free Lossless Audio Codec):是一套著名的自由音频无损压缩编码,其特点是无损压缩。
音频编码原理
音频编码基本概念
压缩编码
其原理是压缩掉冗余的信号,冗余信号是指不能被人耳感知到的信号,包括人耳听觉范围之外的音频信号以及被掩蔽掉的音频信号。
模拟音频信号转换为数字信号需要经过采样和量化,量化的过程被称之为编码,根据不同的量化策略,产生了许多不同的编码方式,常见的编码方式有:PCM 和** ADPCM**
压缩编码的分类:
- 无损压缩(熵编码):霍夫曼编码、算术编码、行程编码
- 有损压缩
- 波形编码–PCM、DPCM、ADPCM 、子带编码、矢量量化
- 参数编码–LPC
- 混合编码–MPLPC、CELP
常见编解码方案
- **专用的音频芯片:**音频编解码算法集成在硬件内部,如 MP3 编解码芯片、语音合成分析芯片等。 使用这种方案的优点就是处理速度块,设计周期短;缺点是局限性比较大,不灵活,难以进行系统升级。
- **A/D 采集卡加上计算机组成硬件平台:**音频编解码算法由计算机上的软件来实现。使用这种方案的优点是价格便宜, 开发灵活并且利于系统的升级;缺点是处理速度较慢,开发难度较大。
- ** A/D 采集芯片:**使用可编程的数据处理能力强的芯片来实现语音信号处理的算法,然后用 ARM 进行控制。采用这种方案的优点是系统升级能力强,可以兼容多种音频压缩格式甚至未来的音频压缩格式,系统成本较低;缺点是开发难度较大,设计者需要移植音频的解码算法到相应的 ARM 芯片中去
常见编码标准
ITU/CCITT 的 G 系列:G.711 、G.721 、G.722 、G.723 、G.728 、G.729;
MPEG 系列的:MPEG-l ,MPEG-2 ,MPEG-4 ,MPEG-7 中的音频编码;
DOLBY( 杜比 ) 实验室的 AC 系列: AC-1 , AC-2 , AC-3 等。
编码的方法
波形编码:尽量保持输入波形不变,即重建的语音信号基本上与原始语音信号波形相同,压缩比较低;
参数编码:要求重建的信号听起来与输入语音一样,但其波形可以不同,它是以语音信号所产生的数学模型为基础的一种编码方法,压缩比较高;
混合编码:综合了波形编码的高质量潜力和参数编码的高压缩效率的混合编码的方法,这类方法也是目前低码率编码的方向。
编码过程
将连续的模拟信号转换成离散的数字信号,完成采样、量化和编码三个步骤。又称为脉冲编码调制(Pulse Code Modulation) ,通常由 A/D 转换器来实现。
音频编码基本原理
概述
语音编码致力于:降低传输所需要的信道带宽, 同时保持输入语音的高质量。
语音编码的目标在于:设计低复杂度的编码器以尽可能低的比特率实现高品质数据传输。
静音阈值曲线
指在安静环境下,人耳在各个频率能听到声音的阈值。
临界频带
由于人耳对不同频率的解析度不同,MPEG1/Audio 将 22khz 内可感知的频率范围,依不同编码层,不同取样频率,划分成** 23~26 **个临界频带。
下图列出理想临界频带的中心频率与频宽。图中可看到,人耳对低频的解析度较好。
Band(Bark) | Lower(Hz) | Center(Hz) | Upper(Hz) |
---|---|---|---|
1 | 0 | 50 | 100 |
2 | 100 | 150 | 200 |
3 | 200 | 250 | 300 |
4 | 300 | 350 | 400 |
5 | 400 | 450 | 510 |
6 | 510 | 570 | 630 |
7 | 630 | 700 | 770 |
8 | 770 | 840 | 920 |
9 | 920 | 1000 | 1080 |
10 | 1080 | 1170 | 1270 |
11 | 1270 | 1370 | 1480 |
12 | 1480 | 1600 | 1720 |
13 | 1720 | 1850 | 2000 |
14 | 2000 | 2150 | 2320 |
15 | 2320 | 2500 | 2700 |
16 | 2700 | 2900 | 3150 |
17 | 3150 | 3400 | 3700 |
18 | 3700 | 4000 | 4400 |
19 | 4400 | 4800 | 5300 |
20 | 5300 | 5800 | 6400 |
21 | 6400 | 7000 | 7700 |
22 | 7700 | 8500 | 9500 |
23 | 9500 | 10500 | 12000 |
24 | 12000 | 13500 | 15500 |
25 | 15500 | 19500 | - |
频域上的掩蔽效应
幅值较大的信号会掩蔽频率相近的幅值较小的信号,如下图:
时域上的遮蔽效应
在一个很短的时间内,若出现了 2 个声音,SPL(sound pressure level) 较大的声音会掩蔽 SPL 较小的声音。
时域掩蔽效应分前向掩蔽(pre-masking)和后向掩蔽(post-masking),其中 post-masking的时间会比较长,约是 pre-masking 的 10 倍。
时域遮蔽效应有助于消除前回音。
音频编码基本手段
量化和量化器
基本概念:
- 量化和量化器:量化是把离散时间上的连续信号,转化成离散时间上的离散信号。
- 常见的量化器有:均匀量化器,对数量化器,非均匀量化器。
- 量化过程追求的目标是:最小化量化误差,并尽量减低量化器的复杂度(这 2 者本身就是一个矛盾)
常见的量化器的优缺点:
- 均匀量化器:最简单,性能最差,仅适应于电话语音。
- 对数量化器:比均匀量化器复杂,也容易实现,性能比均匀量化器好。
- 非均匀(Non-uniform)量化器:根据信号的分布情况,来设计量化器。信号密集的地方进行细致的量化,稀疏的地方进行粗略量化。
语音编码器
基本概念
语音编码器分为三种类形:(a)波形编码器 、(b)声码器 、(c)混合编码器 。
波形编码器以构造出背景噪单在内的模拟波形为目标。作用于所有输入信号,因此会产生高质量的样值并且耗费较高的比特率。
**声码器 **(vocoder) 不会再生原始波形。这组编码器会提取一组参数 ,这组参数被送到接收端,用来导出语音产生模形。声码器语音质量不够好。
混合编码器, 它融入了波形编码器和声码器的长处。
波形编码器
波形编码器的设计常独立于信号,所以适应于各种信号的编码而不限于语音。
- 时域编码
PCM:pulse code modulation,是最简单的编码方式。仅仅是对信号的离散和量化,常采用对数量化。
DPCM:differential pulse code modulation,差分脉冲编码,只对样本之间的差异进行编码。前一个或多个样本用来预测当前样本值。 用来做预测的样本越多,预测值越精确。 真实值和预测值之间的差值叫残差,是编码的对象。
ADPCM:adaptive differential pulse code modulation,自适应差分脉冲编码。即在 DPCM 的基础上,根据信号的变化,适当调整量化器和预测器,使预测值更接近真实信号,残差更小,压缩效率更高。
- 频域编码
频域编码是把信号分解成一系列不同频率的元素,并进行独立编码。
sub-band coding:子带编码是最简单的频域编码技术。
将原始信号由时间域转变为频率域, 然后将其分割为若干个子频带, 并对其分别进行数字编码的技术。
它是利用带通滤波器(BPF)组把原始信号分割为若干(例如 m 个)子频带(简称子带)。 将各子带通过等效于单边带调幅的调制特性, 将各子带搬移到零频率附近, 分别经过 BPF(共 m个)之后,再以规定的速率(奈奎斯特速率)对各子带输出信号进行取样,并对取样数值进行通常的数字编码,其设置 m 路数字编码器。
将各路数字编码信号送到多路复用器,最后输出子带编码数据流。对不同的子带可以根据人耳感知模型,采用不同量化方式以及对子带分配不同的比特数。transform coding:DCT 编码。
离散余弦代码转换
声码器
- channel vocoder:利用人耳对相位的不敏感。
- homomorphic vocoder:能有效地处理合成信号。
- formant vocoder:以用语音信号的绝大部分信息都位于共振峰的位置与带宽上。
- linear predictive vocoder:最常用的声码器。
混合编码器
波形编码器试图保留被编码信号的波形,能以中等比特率(32kbps) 提供高品质语音,但无法应用在低比特率场合。声码器试图产生在听觉上与被编码信号相似的信号,能以低比特率提供可以理解的语音,但是所形成的语音听起来不自然。
混合编码器结合了 2 者的优点:
RELP:在线性预测的基础上,对残差进行编码
** **机制为:只传输小部分残差,在接受端重构全部残差(把基带的残差进行拷贝)。
MPC:multi-pulse coding,对残差去除相关性
用于弥补声码器将声音简单分为 voiced 和 unvoiced,而没有中间状态的缺陷。
CELP: codebook excited linear prediction
用声道预测其和基音预测器的级联,更好逼近原始信号。
MBE: multiband excitation
多带激励,目的是避免 CELP 的大量运算,获得比声码器更高的质量。
音频压缩格式
WAV编码
WAV 编码是在 PCM 数据格式的前面加上** 44 **字节,分别用来描述 PCM 的采样率、声道数、数据格式等信息。
特点:音质非常好、大量软件都支持。
使用场景:多媒体开发的中间文件、保存音乐和音效素材等。
偏移地址 | 大小字节 | 数据块类型 | 内容 |
---|---|---|---|
00H~03H | 4 | char | 资源交换文件标志(RIFF) |
04H~07H | 4 | long | 从下个地址开始到文件尾的总字节数(little-endian 32-bit 正整数,整个档案的大小,扣掉辨识字符和长度,共8个字节。) |
08H~0BH | 4 | char | WAV文件标志(WAVE) |
0CH~0FH | 4 | char | 波形格式标志(fmt),最后一位空格。 |
10H~13H | 4 | 不定 | 过滤字节(一般为00000010H),若为00000012H则说明数据头携带附加信息(见“附加信息”)。 |
14H~15H | 2 | int | 格式种类(值为1时表示数据为线性PCM编码,大于1时表示有压缩的编码) |
16H~17H | 2 | int | 通道数,单声道为1,双声道为2 |
18H~1BH | 4 | long | 采样频率 |
1CH~1FH | 4 | long | 波形数据传输速率(每秒平均字节数):Byte率=采样频率音频通道数每次采样得到的样本位数/8 |
20H~21H | 2 | int | DATA数据块长度,字节。块对齐=通道数*每次采样得到的样本位数/8 |
22H~23H | 2 | int | PCM位宽,即样本数据位数 |
随后2字节 | 2 | int | 附加信息(可选,由上方过滤字节确定) |
随后 | … | 不定长度字符 | “fact”,该部分是可选部分,一般当WAV文件是由某些软件转换而来时,包含该部分。若包含该部分:(1)该部分的前4字节为数据头,一般为4个字母。(2)随后4个字节表示长度,即除去头(4字节)和长度(4字节)之后,数据本身的长度。(3)最后的字节为数据本身。例如:“66 61 73 74 04 00 00 00F8 2F 14 00” 。“66 61 73 74”是fact字段的数据头,“04 00 00 00”是数据本身的长度,“F8 2F 14 00”是数据本身。(注意是little-endian字节顺序) |
随后4字节 | 4 | char | 数据标志符(data) |
随后4字节 | 4 | int | DATA总数据长度 字节 |
随后 | … | 不定 | DATA数据块 |
对于Data块,根据声道数和采样率的不同情况,布局如下(每列代表8bits):
采样率和声道数 | 采样1 | 采样2 | ||||||
---|---|---|---|---|---|---|---|---|
8 Bit 单声道 | 数据1 | 数据2 | ||||||
8 Bit 双声道 | 声道1数据1 | 声道2数据1 | 声道1数据2 | 声道2数据2 | ||||
16 Bit 单声道 | 数据1低字节 | 数据1高字节 | 数据1低字节 | 数据1高字节 | ||||
16 Bit 双声道 | 声道1数据1低字节 | 声道1数据1高字节 | 声道2数据1低字节 | 声道2数据1高字节 | 声道1数据2低字节 | 声道1数据2高字节 | 声道2数据2低字节 | 声道2数据2高字节 |
MP3编码
MP3概述
MPEG-1 or MPEG-2 Audio Layer III是一种音频压缩技术,其全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III),简称为MP3,是目前最流行的音频编码格式。
MPEG音频文件是MPEG1标准中的声音部分,也叫MPEG音频层,它根据压缩质量和编码复杂程度划分为三层,即 Layer-1、Layer-2、Layer-3,且分别对应MP1、MP2、MP3这三种声音文件,并根据不同的用途,使用不同层次的编码。
MP1和MP2的压缩率分别为4:1和6:1-8:1,而MP3的压缩率则高达10:1-12:1
MP3文件结构
MP3文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1)
section | description |
---|---|
ID3V2 | 在文件开始的位置,包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量 |
Frame . . . Frame | 一系列的帧,在文件的中间位置,个数由文件大小和帧长决定; 每个FRAME的长度可能不固定,也可能固定,由位率bitrate决定; 每个FRAME又分为帧头和数据实体两部分; 帧头记录了mp3的位率,采样率,版本等信息,每个帧之间相互独立。 |
ID3V2
ID3V2到现在一共有4个版本,但流行的播放软件一般只支持第3版,即ID3v2.3。由于ID3V1记录在MP3文件的末尾,ID3V2就只好记录在MP3文件的首部了。
ID3V2.3介绍:
每个ID3V2.3的标签都由一个标签头和若干个标签帧或一个扩展标签头组成。关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3文件的首部。
标签头:
在文件的首部顺序记录10个字节的ID3V2.3的头部。数据结构如下:
char Header[3]; //必须为"ID3"否则认为标签不存在
char Ver; //版本号 ID3V2.3就记录3
char Revision; //副版本号 此版本记录为0
char Flag; //存放标志的字节,这个版本只定义了三位,稍后详细解说
char Size[4]; //标签大小,包括标签头的10 个字节和所有的标签帧的大小
1. 标志字节
标志字节一般为0,定义如下:
abc00000
a – 表示是否使用Unsynchronisation(一般不设置)
b – 表示是否有扩展头部,一般没有(至少Winamp 没有记录),所以一般也不设置
c – 表示是否为测试标签(99.99%的标签都不是测试用的啦,所以一般也不设置)
2.标签大小
一共四个字节,但每个字节只用7位,最高位不使用恒为0。所以格式如下:
0xxxxxxx 0xxxxxxx 0xxxxxxx 0xxxxxxx
计算大小时要将0去掉,得到一个28位的二进制数,就是标签大小,计算公式如下:
int total_size;
total_size = (Size[0]&0x7F)*0x200000 + (Size[1]&0x7F)*0x4000 + (Size[2]&0x7F)*0x80 + (Size[3]&0x7F)
上图蓝色部分第7到10字节:表示ID3标签的大小,这里为
total_size =(0x00&0x7F)*0x200000 + (0x00&0x7F)*0x4000 + (0x10&0x7F)*0x80 + (0x72 &0x7F) = 0x872 = 2162
标签帧:
每个标签帧都由一个10个字节的帧头和至少一个字节的不固定长度的内容组成。它们也是顺序存放在文件中,和标签头及其他的标签帧也没有特殊的字符分隔。得到一个完整的帧的内容只有从帧头中得到内容大小后才能读出,读取时要注意大小,不要将其他帧的内容或帧头读入。
帧头的定义如下:
char ID[4]; /用四个字符标识一个帧,说明其内容,稍后有常用的标识对照表/
char Size[4]; /帧内容的大小,不包括帧头,不得小于1/
char Flags[2]; /存放标志,只定义了6位,稍后详细解说/
蓝色部分是一个歌曲标题的标签帧
(1)帧标识
用四个字符标识一个帧,说明一个帧的内容含义,常用的对照如下:
TIT2 = 标题 //表示内容为这首歌的标题,下同
TPE1=作者
TALB=专集
TRCK=音轨 //格式:N/M其中N 为专集中的第N首,M为专集中共M首,N和M为ASCII码表示的数字
TYER=年代 //是用ASCII 码表示的数字
TCON=类型 //直接用字符串表示
COMM=备注 //格式:“eng\0备注内容”,其中eng表示备注所使用的自然语言
注:前4个字节为帧标识,这里是54 49 54 32(TIT2)是标题的标签帧。
(2)大小
这个可没有标签头的算法那么麻烦,每个字节的8 位全用,格式如下
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
算法如下:
int FSize;
FSize = Size[0]0x100000000 + Size[1]0x10000+ Size[2]0x100 + Size[3];
第5到8字节为标签帧的大小,这里为
FSize = 0x000x100000000+ 0x000x10000 + 0x000x100 + 0x24 = 0x24 = 36
注意:这里的帧大小,并不包含帧头的10个字节,只表示帧内容的大小。
(3)标志
只定义了6位,另外的10位为0,但大部分的情况下16位都为0就可以了。格式如下:abc00000ijk00000
- a – 标签保护标志,设置时认为此帧作废
- b – 文件保护标志,设置时认为此帧作废
- c – 只读标志,设置时认为此帧不能修改
- i – 压缩标志,设置时一个字节存放两个BCD码表示数字
- j – 加密标志
- k – 组标志,设置时说明此帧和其他的某帧是一组
标签帧的标识以及其意义对照表:
index | content | index | content |
---|---|---|---|
AENC | [Audio encryption] | TKEY | [Initial key] |
APIC | [Attached picture] | TLAN | [Language(s)] |
COMM | [Comments] | TLEN | [Length] |
COMR | [Commercial frame] | TMED | [Media type] |
ENCR | [Encryption method registration] | TOAL | [Original album/movie/show title] |
EQUA | [Equalization] | TOFN | [Original filename] |
ETCO | [Event timing codes] | TOLY | [Original lyricist(s)/text writer(s)] |
GEOB | [General encapsulated object] | TOPE | [Original artist(s)/performer(s)] |
GRID | [Group identification registration] | TORY | [Original release year] |
IPLS | [Involved people list] | TOWN | [File owner/licensee] |
LINK | [Linked information] | TPE1 | [Lead performer(s)/Soloist(s)] |
MCDI | [Music CD identifier] | TPE2 | [Band/orchestra/accompaniment] |
MLLT | [MPEG location lookup table] | TPE3 | [Conductor/performer refinement] |
OWNE | [Ownership frame] | TPE4 | [Interpreted, remixed, or otherwise modified by] |
PRIV | [Private frame] | TPOS | [Part of a set] |
PCNT | [Play counter] | TPUB | [Publisher] |
POPM | [Popularimeter] | TRCK | [Track number/Position in set] |
POSS | [Position synchronisation frame] | TRDA | [Recording dates] |
RBUF | [Recommended buffer size] | TRSN | [Internet radio station name] |
RVAD | [Relative volume adjustment] | TRSO | [Internet radio station owner] |
RVRB | [Reverb] | TSIZ | [Size] |
SYL | [Synchronized lyric/text] | TSRC | [ISRC (international standard recording code)] |
SYTC | [Synchronized tempo codes] | TSSE | [Software/Hardware and settings used for] |
TALB | [Album/Movie/Show title] | TYER | [Year] |
TBPM | [BPM (beats per minute)] | TXXX | [User defined text information frame] |
TCOM | [Composer] | UFID | [Unique file identifier] |
TCON | [Content type] | USER | [Terms of use] |
TCOP | [Copyright message] | USLT | [Unsychronized lyric/text transcription] |
TDAT | [Date] | WCOM | [Commercial information] |
TDLY | [Playlist delay] | WCOP | [Copyright/Legal information] |
TENC | [Encoded by] | WOAF | [Official audio file webpage] |
TEXT | [Lyricist/Text writer] | WOAR | [Official artist/performer webpage] |
TFLT | [File type] | WOAS | [Official audio source webpage] |
TIME | [Time] | WORS | [Official internet radio station homepage] |
TIT1 | [Content group description] | WPAY | [Payment] |
TIT2 | [Title/songname/content description] | WPUB | [Publishers official webpage] |
TIT3 | [Subtitle/Description refinement] | WXXX | [User defined URL link frame] |
音频数据帧
每个帧都有一个帧头Header,长度是4Byte(32bit),帧头后面可能有两个字节的CRC 校验值,这两个字节的校验值是否存在决定于Header信息的第16bit,为0则帧头后面无校验,为1则有校验,校验值长度为2个字节,紧跟在Header后面的就是帧的实体数据,也就是压缩的声音数据,当解码器读到此处时就进行解码了。格式如下:
(1)帧头格式
帧头长4字节,对于固定位率的MP3文件,所有帧的帧头(即CBR帧头)格式一样,其数据结构如下(注:此结构要自己定义):
typedef struct frameHeader
{
unsigned int sync: 11; //同步信息
unsigned int version: 2; //版本
unsigned int layer: 2; //层
unsigned int error protection: 1; // CRC校验
unsigned int bitrate_index: 4; //位率
unsigned int sampling_frequency: 2; //采样频率
unsigned int padding: 1; //帧长调节
unsigned int private: 1; //保留字
unsigned int mode: 2; //声道模式
unsigned int mode extension: 2; //扩充模式
unsigned int copyright: 1; //版权
unsigned int original: 1; //原版标志
unsigned int emphasis: 2; //强调模式
}FHEADER, *LPHEADER;
MP3帧头字节使用说明:
名字 | 位长 | 说明 | |||||||
---|---|---|---|---|---|---|---|---|---|
同步信息 | 11 | 第1、2字节 | 所有位均为1,第1字节恒为FF。 | ||||||
版本 | 2 | 00-MPEG2.5 01-未定义 10-MPEG 2 11-MPEG 1 | |||||||
层 | 2 | 00-未定义 01-Layer 3 10-Layer 2 11-Layer 1 | |||||||
CRC校验 | 1 | 0-校验 1-不校验 | |||||||
位率 | 4 | 第3字节 | 取样率,单位是kbps,例如采用MPEG-1 Layer 3,64kbps是,值为0101。 V1 - MPEG 1 V2 - MPEG 2 and MPEG 2.5 L1 - Layer 1 L2 - Layer 2 L3 - Layer 3 “free” 表示位率可变 “bad” 表示不允许值 | ||||||
bits | V1,L1 | V1,L2 | V1,L3 | V2,L1 | V2,L2 | V2,L3 | |||
0000 | free | free | free | free | free | free | |||
0001 | 32 | 32 | 32 | 32(32) | 32(8) | 8(8) | |||
0010 | 64 | 48 | 40 | 64(48) | 48(16) | 16(16) | |||
0011 | 96 | 56 | 48 | 96(56) | 56(24) | 24(24) | |||
0100 | 128 | 64 | 56 | 128(64) | 64(32) | 32(32) | |||
0101 | 160 | 80 | 64 | 160(80) | 80(40) | 60(40) | |||
0110 | 192 | 96 | 80 | 192(96) | 96(48) | 80(48) | |||
0111 | 224 | 112 | 96 | 224(112) | 112(56) | 56(56) | |||
1000 | 256 | 128 | 112 | 256(128) | 128(64) | 64(64) | |||
1001 | 288 | 160 | 128 | 288(144) | 160(80) | 128(80) | |||
1010 | 320 | 192 | 160 | 320(160) | 192(96) | 160(96) | |||
1011 | 352 | 224 | 192 | 352(176) | 224(112) | 112(112) | |||
1100 | 384 | 256 | 224 | 384(192) | 256(128) | 128(128) | |||
1101 | 416 | 320 | 256 | 416(224) | 320(114) | 256(114) | |||
1110 | 448 | 384 | 320 | 448(256) | 384(160) | 320(160) | |||
1111 | bad | bad | bad | bad | bad | bad | |||
采样率 | 2 | 采样频率,对于MPEG-1: 00-44.1kHz 01-48kHz 10-32kHz 11-未定义 对于MPEG-2: 00-22.05kHz 01-24kHz 10-16kHz 11-未定义 对于MPEG-2.5: 00-11.025kHz 01-12kHz 10-8kHz 11-未定义 | |||||||
帧长调节 | 1 | 用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。 | |||||||
保留字 | 1 | 没有使用。 | |||||||
声道模式 | 2 | 第4字节 | 表示声道, 00-立体声Stereo 01-Joint Stereo 10-双声道Dual channel 11-单声道Single channel | ||||||
扩充模式 | 2 | 当声道模式为01是才使用。 | |||||||
Value | 强度立体声 | MS立体声 | |||||||
00 | off | off | |||||||
01 | on | off | |||||||
10 | off | on | |||||||
11 | on | on | |||||||
版权 | 1 | 文件是否合法,0-不合法 1-合法 | |||||||
原版标志 | 1 | 是否原版,0-非原版 1-原版 | |||||||
强调方式 | 2 | 用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。 00-未定义 01-50/15ms 10-保留 11-CCITT J.17 |
注意:关于读取帧头也可以使用下面的方法
定义一个结构体:
typedef struct frameHeader
{
unsigned int sync1:8; //同步信息1
unsigned int error_protection:1; //CRC校验
unsigned int layer:2; //层
unsigned int version:2; //版本
unsigned int sync2:3; //同步信息2
unsigned int extension:1; //版权
unsigned int padding:1; //填充空白字
unsigned int sample_rate_index:2; //采样率索引
unsigned int bit_rate_index:4; //位率索引
unsigned int emphasis:2; //强调方式
unsigned int original:1; //原始媒体
unsigned int copyright:1; //版权标志
unsigned int mode_extension:2; //扩展模式,仅用于联合立体声
unsigned int channel_mode:2; //声道模式
}FHEADER, *pFHEADER;
请注意该结构体将同步信息分成了两个部分,而且其他的位的顺序也和上表列出的有所差别,这个主要是因为c语言在存取数据时总是从低位开始,而这个帧头是需要从高位来读取的。
读取方式如下:
FHEADER header;
fread( &header, sizeof( FHEADER ), 1, streams ); //这里假设文件已打开,读取位置已经指向帧头所在的位置
这样一次就可以读入帧头的所有信息了。
第1帧数据:帧头为FF FB 90 04
11111111 11111011 10010000 00000010
前11位:同步信息
第12到13位:版本,其值为11 ->MPEG 1
第14到15位:层,其值为01->Layer 3
第16位:CRC检验标识,其值为1 ->不校验
第17到20位:位率,其值为1001,从前面可知本帧为V1,L3类型, ->128K
第21到22位:采样率,其值为00,从前面知本帧为 MPEG 1-> 44.1K
第23位:帧长调节,其值为0 ->无需调整
第24位:未使用
第25到26位:声道模式,其值为00->立体声Stereo
第27到28位:扩充模式,当声道模式为01(联合立体声)时才使用,此处未使用
第29位:版权,其值为0->无版权
第30位:原版标志,其值为1->是原版文件
第31到32位:强调方式,其值为00->未定义
(2)计算帧长度
我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值如下表所示:
MPEG1 | MPEG2(LSF) | MPEG2.5(LSF) | |
---|---|---|---|
Layer1 | 384 | 384 | 384 |
Layer2 | 1152 | 1152 | 1152 |
Layer3 | 1152 | 576 | 576 |
帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化。
从头中读取比特率,采样频率和填充的值后可以进行计算,
LyaerI使用公式:
帧长度(字节) = (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 * 4
LyerII和LyaerIII使用公式:
帧长度(字节)= (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充
例如图1-3中,比特率为128K,采样率为44.1K,填充0,则其帧长度为:
(1152 / 8 * 128K)/44.1K = 417 (字节)
(3)每帧的持续时间
每帧的持续时间可以通过计算获得,下面给出计算公式
每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000ms
如图1-3中,其每帧时间为:
1152 / 44.1K * 1000 = 26.12 (约等于26ms)
如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的。
(4)CRC校验
如果帧头的校验位为0,则帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进行比较就可以得知该帧是否有效。
(5)数据帧
在帧头后边是Side Info(姑且称之为通道信息)。对标准的立体声MP3文件来说其长度为32字节。通道信息后面是Scale factor(增益因子)信息。当解码器在读到上述信息后,就可以进行解码了。对应图1-3中地址0x880到0x89F(含),此处数据全为0。当MP3文件被打开后,播放器首先试图对帧进行同步,然后分别读取通道信息及增益因子等数据,再进行霍夫曼解码,至此我们已经获得解压后的数据。但这些数据仍然不能进行播放,它们还处于频域,要想听到歌曲还要将它由频域通过特定的手段转换到时域。接下来的处理分别为立体化处理;抗锯齿处理;IMDCT变换;IDCT变换及窗口化滑动处理。** 对于mp3来说现在有两种编码方式:一种是CBR,也就是固定位率,固定位率的帧的大小在整个文件中都是固定的(公式如上所述),只要知道文件总长度,和从第一帧帧头读出的信息,就可以通过计算得出这个mp3文件的信息,比如总的帧数,总的播放时间等等,要定位到某一帧或某个时间点也很方便,这种编码方式不需要文件头,第一帧开始就是音频数据;另一种是VBR,就是可变位率,VBR是XING公司推出的算法,所以在MP3的FRAME里会有“Xing”这个关键字(也有用“Info”来标识的,现在很多流行的小软件也可以进行VBR压缩,它们是否遵守这个约定,那就不得而知了),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240s,分成100段,每两个相邻INDEX的时间差就是2.4s,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。其实这第一帧就相当于文件头了。不过现在有些编码器在编码CBR文件时也像VBR那样将信息记入第一帧,比如著名的lame,它使用“Info”来做CBR的标记。** CBR总播放时长计算公式:播放时长 = (文件大小 – ID3标签大小) * 8 / 比特率 VBR总播放时长计算公式:**播放时长 = 有效数据帧总帧数 * 每帧采样数 / 采样率
(6)VBR头
这里列出VBR的第一帧存储文件信息的头的格式。有两种格式,一种是常见的XINGHeader(头部包含字符‘Xing’),另一种是VBRIHeader(头部包含字符‘VBRI’)鉴于VBRIHeader不常见,下面只说XINGHeader。VBR的第一帧不包含声音数据,其长度是156个字节,用来存放标准的声音帧头(4字节)、VBR文件标识、帧数、文件字节数等信息,具体结构说明见表:
VBR文件第一帧结构:
字节 | 说明 | |
---|---|---|
0 - 3 | 与CBR相同的标准声音帧头 | |
4 - x | 存放VBR文件标识“Xing”(58 69 6E 67),此标识具体位置视采用的MPEG标准和声道模式而定。标识的前后字节没有使用。 | |
36 - 39 | MPEG-1和非单声道(常见) | |
21 - 24 | MPEG-1和单声道 | |
21 - 24 | MPEG-2和非单声道 | |
13 - 16 | MPEG-2和非单声道 | |
40 - 43 | 指示VBR头具体内容的标志, 组合方式为逻辑或。区域是强制的,说明是否存储了帧数、文件长度、目录表和VBR规模信息,如果存储了,则分别为0x0001、0x0002、0x0004、0x0008。 如0x0007(意味总帧数,文件长度,目录表的存储区有效) | |
44 - 47 | 帧数(包括第一帧),存储总帧数的Big-Endian值 | |
48 - 51 | 文件长度,存储文件长度Big-Endian值,单位为字节 | |
52 - 151 | 目录表,用来按时间进行字节定位。 100字节的 TOC 索引,用于快速定位。 对于这个区域的存储内容,我认为可有可无,因为用1个字节来索引一个几兆文件的一帧是不可能做到准确定位的,就我所见基本上所有的VBR的mp3文件的 TOC都几乎是相同的,就是把256平均分成100份然后填进去,其实和正确的值差不到哪里去,如果懒的话这么做也成吧,反正也是不准确的定位。 |
TCO索引的计算方式如下
(TOC[i] / 256) * 文件长度
比如文件持续240秒,我需要跳到60秒,文件长度为5000000字节
计算如下
TOC[(60/240)*100] = TOC[25]
然后相对于文件中的位置大约是在
(TOC[25]/256) * 5000000
如果要自己重建的话,基本是把这个步骤反过来做就可以了。要求准确的话,就需要根据时间点找到正确帧的位置然后再计算,我定位帧的做法都是从第一帧开始搜索,这样偏差我认为不会超过1帧,也比较准确,不过计算出来的TOC的值还是和偷懒的做法大同小异。 152 -155 VBR规模,用于位率变动
在VBR格式的第一帧中,XING Header包括帧头一共最多只需要156个字节就够了,当然也可以在XING Header后面存储编码器的信息,比如lame在其后就是存储其版本,这需要给第一帧留足够的空间才行。
至于mp3的信息用从XING Header读出的信息就可以计算,比如:
总持续时间 = 总帧数 * 每帧采样数 / 采样率 (结果为秒)
平均位率 = 文件长度 / 总持续时间 * 8
ID3V1
ID3V1标准并不周全,存放的信息少,无法存放歌词,无法录入专辑封面、图片等。ID3V2是一个相当完备的标准,但给编写软件带来困难,虽然赞成此格式的人很多,在软件中绝大多数MP3仍在使用ID3V1标准。ID3v1标签包含艺术家,标题,唱片集,发布年代和流派。另外还有额外的注释空间。位于音频文件的最后固定为128字节。可以读取该文件的最后这128字节获得标签。
ID3V1结构如下:
AAABBBBB BBBBBBBB BBBBBBBB BBBBBBBB BCCCCCCC CCCCCCCC CCCCCCCC CCCCCCCD DDDDDDDD DDDDDDDD DDDDDDDD DDDDDEEE EFFFFFFF FFFFFFFF FFFFFFFF FFFFFGHI
ID3V1.0文件尾说明:
| 字节 | 长度(字节) | 说明 |
|-----------|---------|
| 1-3(A) | 3 | 存放“TAG”字符,表示ID3 V1.0标准,紧接其后的是歌曲信息。 |
| 4-33(B) | 30 | 歌名 |
| 34-63© | 30 | 作者 |
| 64-93(D) | 30 | 专辑名 |
| 94-97(E) | 4 | 年份 |
| 98-125(F) | 28 | 附注 |
| 126(G) | 1 | 保留位 |
| 127(H) | 1 | 音轨号 |
| 128(I) | 1 | MP3音乐类别(即流派),共147种 |
ID3V1的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30个字节,则使用’’\0’'填充,数据结构定义如下:
typedef struct tagID3V1
{
charHeader[3]; /*标签头必须是"TAG"否则认为没有标签*/
charTitle[30]; /*标题*/
charArtist[30]; /*作者*/
charAlbum[30]; /*专集*/
charYear[4]; /*出品年代*/
charComment[28]; /*备注*/
charreserve; /*保留*/
chartrack; /*音轨*/
charGenre; /*类型*/
}ID3V1, *pID3V1;
AAC编码
概述
AAC是新一代的音频有损压缩技术,它通过一些附加的编码技术(比如PS,SBR等),衍生出了LC-AAC,HE-AAC,HE-AACv2三种主要的编码,LC-AAC就是比较传统的AAC,相对而言,主要用于中高码率(>=80Kbps),HE-AAC(相当于AAC+SBR)主要用于中低码率(<=80Kbps),而新近推出的HE-AACv2(相当于AAC+SBR+PS)主要用于低码率(<=48Kbps),事实上大部分编码器设成<=48Kbps自动启用PS技术,而>48Kbps就不加PS,就相当于普通的HE-AAC。
扩展名
AAC编码的主要扩展名有三种:
1).AAC:使用MPEG-2 Audio Transport Stream( ADTS,参见MPEG-2 )容器,区别于使用MPEG-4容器的MP4/M4A格式,属于传统的AAC编码(FAAC默认的封装,但FAAC亦可输出 MPEG-4 封装的AAC)
2).MP4:使用了MPEG-4 Part 14的简化版即3GPP Media Release 6 Basic (3gp6,参见3GP ) 进行封装的AAC编码(Nero AAC 编码器仅能输出MPEG-4封装的AAC);
3).M4A:为了区别纯音频MP4文件和包含视频的MP4文件而由苹果(Apple)公司使用的扩展名,Apple iTunes 对纯音频MP4文件采用了".M4A"命名。M4A的本质和音频MP4相同,故音频MP4文件亦可直接更改扩展名为M4A。
AAC规格
AAC共有9种规格,以适应不同的场合的需要:
文件 | 规格 |
---|---|
MPEG-2 AAC LC | 低复杂度规格(Low Complexity) |
MPEG-2 AAC Main | 主规格 |
MPEG-2 AAC SSR | 可变采样率规格(Scaleable Sample Rate) |
MPEG-4 AAC LC | 低复杂度规格(Low Complexity) |
MPEG-4 AAC Main | 主规格 |
MPEG-4 AAC SSR | 变采样率规格(Scaleable Sample Rate) |
MPEG-4 AAC LTP | 长时期预测规格(Long Term Predicition) |
MPEG-4 AAC LD | 低延迟规格(Low Delay) |
MPEG-4 AAC HE | 高效率规格(High Efficiency) |
MPEG-2 AAC LC:比较简单,无增益控制,但提高了编码效率,在中等码率(96kbps-192kbps)的编码效率以及音质方面,都能找到平衡点。
MPEG-4 AAC LC:常用于MP4文件中的音频编码。
MPEG-4 AAC Main:包含了除增益控制之外的全部功能,其音质最好。
MPEG-4 AAC HE:适合用于低码率(32kbps-96kbps)编码。
目前使用最多的是LC和HE(适合低码率)。流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术。
HE:“High Efficiency”(高效性)。HE-AAC v1(又称AACPlusV1,SBR),用容器的方法实现了AAC(LC)+SBR技术。SBR其实代表的是Spectral Band Replication(频段复制)。简要叙述一下,音乐的主要频谱集中在低频段,高频段幅度很小,但很重要,决定了音质。如果对整个频段编码,若是为了保护高频就会造成低频段编码过细以致文件巨大;若是保存了低频的主要成分而失去高频成分就会丧失音质。SBR把频谱切割开来,低频单独编码保存主要成分,高频单独放大编码保存音质,“统筹兼顾”了,在减少文件大小的情况下还保存了音质,完美的化解这一矛盾。
** HEv2**:用容器的方法包含了HE-AAC v1和PS技术。PS指“parametric stereo”(参数立体声)。原来的立体声文件文件大小是一个声道的两倍。但是两个声道的声音存在某种相似性,根据香农信息熵编码定理,相关性应该被去掉才能减小文件大小。所以PS技术存储了一个声道的全部信息,然后,花很少的字节用参数描述另一个声道和它不同的地方。
AAC特点
1)AAC是一种高压缩比的音频压缩算法,但它的压缩比要远超过较老的音频压缩算法,如AC-3、MP3等。并且其质量可以同未压缩的CD音质相媲美。
2)同其他类似的音频编码算法一样,AAC也是采用了变换编码算法,但AAC使用了分辨率更高的滤波器组,因此它可以达到更高的压缩比。
3)AAC使用了临时噪声重整、后向自适应线性预测、联合立体声技术和量化哈夫曼编码等技术,这些技术的使用都使压缩比得到进一步的提高。(压缩比通常为18:1)
4)AAC支持更多种采样率和比特率、支持1个到48个音轨、支持多达15个低频音轨、具有多种语言的兼容能力、还有多达15个内嵌数据流。
5)AAC支持更宽的声音频率范围,最高可达到96kHz,最低可达8KHz,远宽于MP3的16KHz-48kHz的范围。
6)不同于MP3及WMA,AAC几乎不损失声音频率中的甚高、甚低频率成分,并且比WMA在频谱结构上更接近于原始音频,因而声音的保真度更好。
7)AAC采用优化的算法达到了更高的解码效率,解码时只需较少的处理能力。
8)不足:属于有损压缩,与APE、FLAC等无损格式相比,音质有“本质上”差距,同时USB3.0和大容量存储空间等技术的普及,AAC的优势不明显。
AAC音频格式解析
AAC音频格式有ADIF、ADTS、LATM:
- ADIF:Audio Data Interchange Format音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
- ADTS:Audio Data Transport Stream音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。
- LATM 的全称为“Low-overhead MPEG-4 Audio TransportMultiplex”(低开销音频传输复用),是MPEG-4 AAC制定的一种高效率的码流传输方式,MPEG-2 TS流也采用LATM作为AAC音频码流的封装格式之一。
LATM格式
LATM格式也以帧为单位,主要由AudioSpecificConfig(音频特定配置单元)与音频负载组成。
音频负载主要由PayloadLengthInfo(负载长度信息)和PayloadMux(负载净荷)组成。
AudioSpecificConfig 信息可以是带内传,也可以是带外传。所谓带内传,就是指每一个LATM 帧,都含有一个AudioSpecificConfig 信息;而带外传,则每一个LATM帧都不含有AudioSpecificConfig信息,而通过其他方式把AudioSpecificConfig信息发送到解码端,由于AudioSpecificConfig信息一般是不变的,所以只需发送一次即可。
AudioSpecificConfig 主要参数:
参数 | 含义 |
---|---|
numSubFrames | 子帧的数目 |
numProgram | 复用的节目数 |
numLayer | 复用的层数 |
frameLengthType | 负载的帧长度类型,包括固定长度与可变长度 |
audioObjectType | 音频对象类型 |
samplingFrequency | 采样率 |
channelConfiguration | 声道配置 |
音频负载由若干子帧组成,每个子帧由PayloadLengthInfo和PayloadMux组成,与ADTS帧净荷一样,音频负载主要包含原始帧数据。
AAC的ADIF格式见下图:
header() | raw_data_stream() |
---|
AAC的ADTS的一般格式见下图:
syncword | header() | error_check() | raw_data_block() |
---|
ADIF和ADTS的header
(1)ADIF的头信息:
ADIF头信息位于AAC文件的起始处,接下来就是连续的raw data blocks。
组成ADIF头信息的各个域如下所示:
Field name | Size(bits) | Comment |
---|---|---|
adif_id | 32(bits) | Always: “ADIF” |
copyright_id_present | 1 | |
copyright_id | 72 | Only if copyright_id_present == 1 |
original_copy | 1 | |
home | 1 | |
bitstream_type | 1 | 0: CBR, 1: VBR |
bitrate | 23 | For CBR: bitrate, for VBR: peak bitrate, 0 means unknown |
num_program_config_elements | 4 | |
The next 2 fields come (num_program_config_elements + 1) times | ||
buffer_fullness | 20 | Only if bitstream_type == 0 |
program_config_element | VAR |
(2)ADTS头文件结构和信息:
AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成。
一般情况下ADTS的头信息都是7个字节,分为2部分:其一为固定头信息,紧接着是可变头信息。固定头信息中的数据每一帧都相同,而可变头信息则在帧与帧之间可变。
ADTS的固定头信息:
- Syncword:同步字,总是0xFFF,all bits must be 1,代表着一个ADTS帧的开始;解码器可通过0xFFF确定每个ADTS的开始位置,因为它的存在,解码可以在这个流中任何位置开始, 即可以在任意帧解码。
- ID:MPEG Version: 0 for MPEG-4,1 for MPEG-2
- Layer:always: ‘00’
- protection_absent:Warning, set to 1 if there is no CRC and 0 if there is CRC
- profile:表示使用哪个级别的AAC,如01 Low Complexity(LC) – AAC LC。
profile的值等于 Audio Object Type的值减1。
profile = MPEG-4 Audio Object Type - 1
在MPEG-2 AAC中定义了3种:
- sampling_frequency_index:表示使用的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。
here are 13 supported frequencies:
- channel_configuration:表示声道数,比如2表示立体声双声道
ADTS的可变头信息:
- aac_frame_length:一个ADTS帧的长度包括ADTS头和AAC原始流。
- adts_buffer_fullness:0x7FF说明是码率可变的码流。
- number_of_raw_data_blocks_in_frame:
表示ADTS帧中有number_of_raw_data_blocks_in_frame + 1个AAC原始帧。所以说number_of_raw_data_blocks_in_frame == 0 表示说ADTS帧中有一个AAC数据块。(一个AAC原始帧包含一段时间内1024个采样及相关数据)
组成ADTS头信息的各个域如下所示:
序号 | 域 | 长度(bits) | 说明 |
---|---|---|---|
1 | Syncword | 12 | all bits must be 1 |
2 | MPEG version | 1 | 0 for MPEG-4, 1 for MPEG-2 |
3 | Layer | 2 | always “00” |
4 | Protection Absent | 1 | et to 1 if there is no CRC and 0 if there is CRC |
5 | Profile | 2 | the MPEG-4 Audio Object Type minus 1 |
6 | MPEG-4 Sampling Frequency Index | 4 | MPEG-4 Sampling Frequency Index (15 is forbidden) |
7 | Private Stream | 1 | set to 0 when encoding, ignore when decoding |
8 | MPEG-4 Channel Configuration | 3 | MPEG-4 Channel Configuration (in the case of 0, the channel configuration is sent via an inband PCE) |
9 | Originality | 1 | set to 0 when encoding, ignore when decoding |
10 | Home | 1 | set to 0 when encoding, ignore when decoding |
11 | Copyrighted Stream | 1 | set to 0 when encoding, ignore when decoding |
12 | Copyrighted Start | 1 | set to 0 when encoding, ignore when decoding |
13 | Frame Length | 13 | this value must include 7 or 9 bytes of header length: FrameLength = (ProtectionAbsent == 1 ? 7 : 9) + size(AACFrame) |
14 | Buffer Fullness | 11 | buffer fullness |
15 | Number of AAC Frames | 2 | number of AAC frames (RDBs) in ADTS frame minus 1, for maximum compatibility always use 1 AAC frame per ADTS frame |
16 | CRC | 16 | CRC if protection absent is 0 |
ADIF和ADTS数据信息
在AAC中,原始数据块的组成可能有六种不同的元素:
SCE:Single Channel Element单通道元素。单通道元素基本上只由一个ICS组成。一个原始数据块最可能由16个SCE组成。
CPE:Channel Pair Element 双通道元素,由两个可能共享边信息的ICS和一些联合立体声编码信息组成。一个原始数据块最多可能由16个SCE组成。
CCE:Coupling Channel Element 藕合通道元素。代表一个块的多通道联合立体声信息或者多语种程序的对话信息。
LFE:Low Frequency Element 低频元素。包含了一个加强低采样频率的通道。
DSE:Data Stream Element 数据流元素,包含了一些并不属于音频的附加信息。
PCE:Program Config Element 程序配置元素。包含了声道的配置信息。它可能出现在ADIF 头部信息中。
FIL:Fill Element 填充元素。包含了一些扩展信息。如SBR,动态范围控制信息等。
将AAC打包成ADTS格式
一般情况的解码工作都是由硬件来完成的,所以大部分的工作是把AAC原始流打包成ADTS的格式,然后丢给硬件就行了。
通过对ADTS格式的了解,很容易就能把AAC打包成ADTS。我们只需得到封装格式里面关于音频采样率、声道数、元数据长度、aac格式类型等信息。然后在每个AAC原始流前面加上个ADTS头就OK了。
贴上ffmpeg中添加ADTS头的代码,就可以很清晰的了解ADTS头的结构:
int ff_adts_write_frame_header(ADTSContext *ctx, uint8_t *buf, int size, int pce_size)
{
PutBitContext pb;
init_put_bits(&pb, buf, ADTS_HEADER_SIZE);
/* adts_fixed_header */
put_bits(&pb, 12, 0xfff); /* syncword */
put_bits(&pb, 1, 0); /* ID */
put_bits(&pb, 2, 0); /* layer */
put_bits(&pb, 1, 1); /* protection_absent */
put_bits(&pb, 2, ctx->objecttype); /* profile_objecttype */
put_bits(&pb, 4, ctx->sample_rate_index);
put_bits(&pb, 1, 0); /* private_bit */
put_bits(&pb, 3, ctx->channel_conf); /* channel_configuration */
put_bits(&pb, 1, 0); /* original_copy */
put_bits(&pb, 1, 0); /* home */
/* adts_variable_header */
put_bits(&pb, 1, 0); /* copyright_identification_bit */
put_bits(&pb, 1, 0); /* copyright_identification_start */
put_bits(&pb, 13, ADTS_HEADER_SIZE + size + pce_size); /* aac_frame_length */
put_bits(&pb, 11, 0x7ff); /* adts_buffer_fullness */
put_bits(&pb, 2, 0); /* number_of_raw_data_blocks_in_frame */
flush_put_bits(&pb);
return 0;
}
AAC文件处理流程
(1)判断文件格式,确定为ADIF或ADTS;
(2)若为ADIF,解ADIF头信息,跳至第6步;
(3)若为ADTS,寻找同步头;
(4)解ADTS帧头信息;
(5)若有错误检测,进行错误检测;
(6)解块信息;
(7)解元素信息。
ALAC编码格式
ALAC(Apple Lossless Audio Codec)苹果的无损音频压缩编码格式,ALAC与MP3的主要分别在于编码过程中,MP3会取消小部分高频及低频部分的音频数据,而ALAC则会如实记录,不会删除音频中任何细节数据。由于资料无损,ALAC音频文件大小会比MP3大,通常每片音乐CD(约70至80分钟)经ALAC编码后,音频文件大小约300MB。
常见ALAC编码音频文件同AAC编码音频均采用m4a容器封装,需注意查看编码信息可区分它们。
AC-3编码格式
简介
AC-3(Digital Audio Compression Standard)音频编码格式,传说中的杜比实验室的杰作,著名的有损数据压缩的多媒体储存格式。可以包括多达6个独立的声道。最知名的是5.1声道技术。在5.1声道技术中,5代表着5个基本声道,独立连接至五个不同的喇叭(20至20,000 Hz),分别是右前(RF),中(C),左前(LF),右后(RR),左后(LR);而1则代表1个低频声效,连接至低音辅助喇叭(20至120 Hz)每个AC-3 的音频帧都是以0x0B77为同步头。开源解码库liba52。
AC-3是一种灵活的音频数据压缩技术,它具有将多种声轨格式编码为一种低码率比特流的能力。支持8种不同的声道配置方式,从传统的单声道、立体声到拥有6个分离声道的环绕声格式(左声道、中置声道、右声道、左环绕声道、右环绕声道及低音效果声道)。AC-3的比特流所允许的采样频率可以为48 kHz、44.1 kHz、或32 kHz中的任何一种,并且所支持的码率从32 kbps(千比特位/秒)到640 kbps不等。
AC-3比特流的特征
AC-3的比特流是由帧(Frame)构成的,在恒定的时间间隔内,其所有编码的声道所包含的信息就能体现在1536个PCM采样值的信息。每一个AC-3的帧(Frame)都具有固定的尺寸,只由采样频率及编码数据率决定。同时,每个帧(Frame)都是独立的实体而且并不与前一个帧(Frame)分享数据,除了在MDCT所固有的去交迭变换。
YNC | CRC#1 | SI | BSI | AUDIO BLOCK 0 | AUDIO BLOCK 1 | AUDIO BLOCK 2 | AUDIO BLOCK 3 | AUDIO BLOCK 4 | AUDIO BLOCK 5 | AUX DATA | CRC#2 |
---|
AC-3帧结构
Block Switch Flags | Dither Flags | Dynamic Range Control | Coupling Strategy | Coupling Coordinates | Exponent Strategy | Exponents | Bit Allocation Parameters | Mantissas |
---|
AC-3声音块结构
在每个AC-3帧(Frame)的开头是SI域(同步信息Sync Information)及BSI域(比特流信息)。SI域及BSI域描述了比特流的结构,包括采样频率、数据码率、编码声道的数目及其他一些系统描述的元素。每个帧用两个CRC(循环冗余码校验字)字来提供侦错手段,一个位于帧的起始处,另一个位于帧的结尾。每个帧有6个声音块,每个块表示为每个编码声道包含256个PCM取样(sample)(详见图6-2)。声音块中所含内容包括块转换标志,耦合坐标、指数、位分配参数、尾数。允许在帧的内部进行数据分享,比如在声音块0中的数据可以被同一帧内的后续块所使用。在每个帧的结尾处有一个可选的辅助数据域,在这个区域内允许系统设计者在AC-3比特流中嵌入可在整个系统内传递的、自有的控制字及状态字信息。AC-3的编/解码器被设计成一个完整的音频子系统的解决方案,它拥有普通的低码率编/解码所没有的许多特性。这些特性包括适用于消费类音频回放系统的动态范围压缩特性(Dynamic Range Compression)、对话归一(Dialog Normalization)以及缩混特性(Downmixing),缩混特性可以将多声道音频进行转换为特定数目的声道输出。动态范围控制(Dynamic Range Control)的控制字是嵌入在AC-3比特流内,并被解码器应用,可以使同一个比特流源在不同模式下进行还音。
APE编码格式
简介
APE是Monkey’s Audio提供的一种无损压缩音频格式,压缩比大约为2:1(为源文件的60%左右)。
(1)Monkey’s Audio是高优化和高效率的;
(2)无损压缩,没有质量损失;
(3)可以被大多数的流行players和rippers支持,如Media Center、Foobar、WMP、Winamp等;
(4)完全免费和开源。
APE文件结构
Header句法结构
Header的内容包括:文件的属性、sound的参数(如声道数、采样率等)、内部结构(如帧数、Seek Table,甚至可能包括WAV的header)。Header的句法结构如下图所示:
Header元素含义:
(1)tag:此元素的值为四个字符“MAC”,是APE文件的标志。可以通过该标志来判断一个媒体文件是否为APE文件。
(2)compression_level:压缩等级,对应的等级如下所示:
(3)format_flags:APE文件标记,标记了APE文件以及APE编码格式的一些属性,如sample的位数、是否含有CRC校验、是否含有WAVE Header等等。ffmpeg对format_flags值的定义如下所示,这也是在句法结构图中的那些数字的含义。
#define MAC_FORMAT_FLAG_8_BIT 1 // is 8-bit [OBSOLETE]
#define MAC_FORMAT_FLAG_CRC 2 // uses the new CRC32 error detection [OBSOLETE]
#define MAC_FORMAT_FLAG_HAS_PEAK_LEVEL 4 // uint32 nPeakLevel after the header [OBSOLETE]
#define MAC_FORMAT_FLAG_24_BIT 8 // is 24-bit [OBSOLETE]
#define MAC_FORMAT_FLAG_HAS_SEEK_ELEMENTS 16 // has the number of seek elements after the peak level
#define MAC_FORMAT_FLAG_CREATE_WAV_HEADER 32 // create the wave header on decompression (not stored)
(4)seek_table_length:标识了seek_table的长度。在file_version大于等于3980的版本中,seek_table_length是seek_table所占用的字节数;而在file_version小于3980的版本中,seek_table_length是seek_table包含的数组元素个数,与seek_table包含字节数为四倍的关系。
(5)seek_table:seek_table中存放的是每个frame在APE文件中的position。但是,在真正去读取frame的时候,需要考虑四字节对齐的问题。
(6)total_frames:包含frame的个数。
(7)blocks_per_frame:标识每个frame包含的block的个数,这只对前total _frames - 1的frame有效。对于最后一个frame,它所包含的block的个数由句法元素final_frame_blocks的值来指定。
(8)final_frame_blocks:最后一个frame包含的block的个数。
APE Tag结构
APE tag用来存放metadata数据,比如歌名、演唱者、专辑名等等,这些信息就称为tag(标签)信息。APE tag有两个版本,即APEV1与APEV2。APEV1一般放在文件的末尾,而APEV2具有与ID3v2一样的灵活性和可括展性,字段名可自定义,字段长度可扩展,同时格式定义又不像ID3v2那么繁琐。APEV2的格式很简单,实现起来也很方便,tag存放位置是可选的,既可以在文件头也可以在文件尾。APEV1与APEV2的区别主要有两个方面:
(a)APEV1使用的是ACSII编码,而APEV2使用的是UTF-8编码,使得可以实现unicode支持。
(b)APEV2标准里增加了一个APE Tags Header,APEV1里面没有。
APEV1与APEV2的结构分别如下图所示:
(1)APE Tags Header
APE Tags Header只在APEV2中才有,其内容包括整个tag的长度、item的个数等。最开始是固定的8个字符“APETAGEX”,用来标识tag header的开始。APE Tags Header与APE Tags Footer的结构相似,唯一的不同就是Tags Flag中的一个bit,这也是用于区分APE Tags Header与APE Tags Footer的一个标记。APE Tags Header的结构如下所示:
Preamble | 64 bits | {‘A’, ‘P’, ‘E’, ‘T’, ‘A’, ‘G’, ‘E’, ‘X’} |
---|---|---|
Version Number, Bits 0…7 Version Number, Bits 8…15 Version Number, Bits 16…23 Version Number, Bits 24…31 | 32 bits | 1000 = Version 1.000 (old) 2000 = Version 2.000 (new) |
Tag Size, Bits 0…7 Tag Size, Bits 8…15 Tag Size, Bits 16…23 Tag Size, Bits 24…31 | 32 bits | Tag size in bytes including footer and all tag items excluding the header to be as compatible as possible with APE Tags 1.000 |
Item Count, Bits 0…7 Item Count, Bits 8…15 Item Count, Bits 16…23 Item Count, Bits 24…31 | 32 bits | Number of items in the Tag (n) |
Tags Flags, Bits 0…7 Tags Flags, Bits 8…15 Tags Flags, Bits 16…23 Tags Flags, Bits 24…31 | 32 bits | Global flags of all items (there are also private flags for every item) |
Reserved | 64 bits | Must be zero |
(2)APE Tag Item
APE Tag Item存在于APEV1和APEV2中,其结构如下所示:
Size of the Item Value, Bits 0…7 Size of the Item Value, Bits 8…15 Size of the Item Value, Bits 16…23 Size of the Item Value, Bits 24…31 | 32 bits | Length len of the assigned value in bytes |
---|---|---|
Tags Flags, Bits 0…7 Tags Flags, Bits 8…15 Tags Flags, Bits 16…23 Tags Flags, Bits 24…31 | 32 bits | Item flags |
Item Key | m bytes | Item key, can contain ASCII characters from 0x20 (Space) up to 0x7E (Tilde) |
0x00 | 1 byte | Item key terminator |
Item Value | len bytes | Item value, can be binary data or UTF-8 string |
(3)APE Tags Footer
APE Tags Footer与APE Tags Header的结构相似,但它可以存在于APEV1和APEV2中。唯一的不同就是Tags Flag中的一个bit位,这也是用于区分APE Tags Header与APE Tags Footer的一个标记。最开始是固定的8个字符“APETAGEX”,用来标识tag footer的开始。APE Tags Footer的结构如下所示:
Preamble | 64 bits | {‘A’, ‘P’, ‘E’, ‘T’, ‘A’, ‘G’, ‘E’, ‘X’} |
---|---|---|
Version Number, Bits 0…7 Version Number, Bits 8…15 Version Number, Bits 16…23 Version Number, Bits 24…31 | 32 bits | 1000 = Version 1.000 (old) 2000 = Version 2.000 (new) |
Tag Size, Bits 0…7 Tag Size, Bits 8…15 Tag Size, Bits 16…23 Tag Size, Bits 24…31 | 32 bits | Tag size in bytes including footer and all tag items excluding the header to be as compatible as possible with APE Tags 1.000 |
Item Count, Bits 0…7 Item Count, Bits 8…15 Item Count, Bits 16…23 Item Count, Bits 24…31 | 32 bits | Number of items in the Tag (n) |
Tags Flags, Bits 0…7 Tags Flags, Bits 8…15 Tags Flags, Bits 16…23 Tags Flags, Bits 24…31 | 32 bits | Global flags of all items (there are also private flags for every item) |
Reserved | 64 bits | Must be zero |
(4)一个简单的示例
上面的几个图来自wiki,可能有点抽象。我们以一个简单的示例来说明一下,这样比较直观。如下图所示,图为在Linux平台用ghex打开的一个APE文件。
从图中可以看出,该tag为APEV2 tag。
a、APE Tags Header
首先是APE Tags Header,从图中可以很容易的找到,以“APTTAGEX”开始,然后是4个字节的version,0x00 00 07 D0,即version为2000。
然后是四个字节的tag size,为0x00 00 00 72,即整个APE tag包括114个字节,其中不包括APE Tags Header的长度。可以从图中数一下,确实是114个字节。
在然后的四个字节是item的个数,0x00 00 00 03,即包括三个item。
紧接着是4个字节的flags,为0xA0 00 00 00。
最后是reserved的8个字节,全部为0。
b、APE Tag Item
由对APE Tags Header的分析可以知道,该tag中包括了三个item,从图中也可以看的出来,分别为Title、Artist和Album。我们可以以Title这个item为例进行分析。APE Tags Header为固定的32个字节,因此,跳过32个字节之后便是Title这个item的内容。
首先是四个字节的length,0x00 00 00 0C,即为12个字节。这个12表示该item的value占12个字节。
然后是四个字节的flags,这里为0x00 00 00 00。
接着是item的key,这里为Title,是ASCII编码。item的key后面是一个字节的标志位,为0x00,用于标识item的key结束。
最后是item的value,由上面的分析可以知道为12个字节。
c、APE Tags Footer
APE Tags Footer的结构和APE Tags Header的结构是一样的,而且内容几乎一样,唯一的区别就在于flag。APE Tags Header的flag为0xA0 00 00 00,而APE Tags Footer的flag为0x80 00 00 00。查看了几个APE文件,APE Tags Header的flag都为0xA0 00 00 00,而APE Tags Footer的flag都为0x80 00 00 00,这两个flag的值可能是固定的值(个人猜测),以此来区分APE Tags Footer与APE Tags Header。
FLAC编码格式
FLAC(Free Lossless Audio Codec)中文可解释为无损音频压缩编码。
FLAC编码过程
Flac把未压缩的音频流划分为块(block),并独立压缩,压缩后的数据块形成数据帧(frame),把数据帧连接形成压缩后的flac数据流(stream)。
FLAC文件结构
Field Name | Length(bit) | Description |
---|---|---|
文件标记“fLaC” | 32 | “fLaC”标志,用于识别flac数据流 0x66 0x41 0x61 0x43 |
METADATA BLOCK | 34*8 | STREAMINFO,必选的metadata block,说明Stream的基本特性(采样率、声道数…)。 |
METADATA BLOCK | 一个或者多个metadata block,可选。(解码时可以不用识别) | |
AUDIO FRAMES | 一个或者多个Audio Frame |
AMR编码
简介
AMR(Adaptive Multi-Rate)自适应多速率音频压缩音频编码格式,是一个使语音编码最优化的专利,专用于有效地压缩语音频率。
AMR音频主要用于移动设备的音频压缩,压缩比非常高,但是音质比较差,主要用于语音类的音频压缩,不适合对音质要求较高的音乐类音频的压缩。AMR被标准语音编码 3GPP在1998年10月选用,现在广泛在GSM和UMTS中使用。它使用1-8个不同的位速编码。之前的手机里有很多amr的音频文件,可分成:
- AMR-NB(AMR-NarrowBind),语音带宽范围:300-3700Hz,8KHz采样频率,每20ms编码一帧,每个帧中包含160个语音样点;
- AMR-WB(Adaptive Multi-Rate - Wideband Speech Codec),语音带宽范围50-7000Hz,16KHz采样频率。但考虑语音的短时相关性,每帧长度均为20ms;
- AMR-WB+(Extended Adaptive Multi-Rate - Wideband Speech Codec):amr-nb和amr-wb都属于speech codec,对audio的编码效果并不好,为了提高对audio的编码效果,出现了amr-wb+。amr-wb+可以支持更高的采样率,对speech和audio采用不同的编码算法,对speech采用ACELP编码,对audio采用变换编码。amr-wb+在低比特率上对audio的编码效果与he aac+相当。amr-wb+包含amr-wb,但复杂度更高。
AMR编码方式
说明:
比特率是指将数字声音由模拟格式转化成数字格式的采样率,采样率越高,还原后的音质就越好。
比特率值与现实音频对照:
- 16kbps=电话音质
- 24kbps=增加电话音质,短波广播,长波广播,欧洲制式中波广播
- 40kbps=美国制式中波广播
- 56kbps=话音
- 64kbps=增加话音(手机铃声最佳比特率设定值,手机单声道MP3播放器最佳设定值)
- 112kbps=FM调频立体声广播
- 128kbps=磁带(手机立体声MP3播放器最佳设定值,低档MP3播放器最佳设定值)
- 160kbps=HIFI高保真(中高档MP3播放器最佳设定值)
- 192kbps=CD(高档MP3播放器最佳设定值)
- 256kbps=Studio音乐工作室(音乐发烧友适用)
ATRAC编码
ATRAC(Adaptive Transform Acoustic Coding)是Sony 公司开发的一种相对老的音频编码格式,又细分成ATRAC1、ATRAC2、ATRAC3、ATRAC3plus,这些都是独立的技术,后来Sony把这些技术统称为ATRAC。在rmvb的封装格式中也能看到这种音频编码格式。
DTS编码格式
DTS(Digital Theater Systems)大名鼎鼎的DTS(数码影院系统)是由DTS公司开发,一种多通道的音频技术,低损,环绕立体声,被广泛的应用在DVD等高清片源上。同样也需要授权,与杜比公司是竞争对手。最常见的是DTS 5.1:保存5条音频通道的数据用于环绕立体声,分别是center,left-front,right-front,left-rear,and right-rear。除此之外DTS公司还开发了DTS 70 mm、DTS 70 ES、DTS NEO:6、DTS 96/24、DTS-HD Master Audio、DTS-HD High Resolution Audio、DTS Connect、DTS Surround Sensation等技术。由于版权比较严格,而且文档很难从网上找到。
OGG编码格式
OGG是一个自由且开放标准的容器格式,由Xiph.Org 基金会所维护,“Ogg”意指一种文件格式,可以纳入各式各样自由和开放源代码的编解码器,包含音效、视频、文字(像字幕)与元数据的处理。
一般说到OGG,都是指Ogg_Vorbis,这就是咱们常见的.ogg结尾的音频文件,Vorbis是一种有损音讯压缩格式,由Xiph.Org基金会所领导并开放源代码。Vorbis通常以Ogg作为容器格式,所以常合称为Ogg Vorbis。其实,OGG不仅仅只能包含Vorbis格式,它可以包含视频格式。因此,为了区分只包含音频格式的文件格式,产生了一种新的文件格式OGV,这种格式既包含音频格式,也包含视频格式。但是OGV文件格式的压缩方法和OGG是一样的,可以采用同一种方式进行解析。
优缺点:
**优点:**① Ogg Vorbis的音质和MP3不相上下,但无法和FLAC比。
② Ogg Vorbis支持类似于MP3的ID3信息;
③ Ogg Vorbis格式支持流式播放;
④ Ogg Vorbis避免了像MP3文件的ID3标记那样烦琐的操作(有很多针对MP3的ID3修改软件标记早已不繁琐)。
**缺点:**① 播放兼容性差。mp3已经成了便携随身听的代名词。绝大多数播放器、包括手机、pad等设备都支持mp3格式(其实mp3专利芯片授权费极低),而支持ogg格式的播放器很少。
② mp3是1997年以前就已经诞生,将近20年垄断了消费机市场。ogg音频普及性非常差,相对于mp3而言音质也没有竞争力,普及的可能性极低。
③ 相对于已经普及的微软WMA格式,ogg没有任何优势。不管是播放软件兼容性,码率,流媒体等方面。
④ 多声道系统已经由DOLBY、DTS两家公司垄断,他们都有完整的制作发行体系。大型多声道电影、电视、音乐制作都是基于这两家公司的技术和标准。ogg只能望洋兴叹了。
⑤ 很多专业音频制作软件不支持ogg文件格式。
⑥ 现今HIFI已经被HIRES(高解析)代替,随着存储、网速等限制,用户的聆听设备已经上了一个台阶,有损格式已经渐渐失去市场。
PCM编码
简介
PCM (Pulse Code Modulated Audio)也被称为脉冲编码调制,是目前计算机应用中最高保真水平的音频编码格式。PCM音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准的数字音频数据。PCM约定俗成了无损编码,能做到最大程度的无限接近绝对保真。被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的WAV文件中均有应用,优点是音质好,缺点是体积大。
做嵌入式音视频产品时,一般情况的音视频都是芯片负责解码。如果遇到版权问题,例如AC3、DTS,有些时候芯片厂商要求很严格,用户会采取软解的方法,软解也就是把AC3 DTS等音频解成PCM,然后在送给芯片。
PCM编码方式:
PCM数据格式
如果是单声道的音频文件,采样数据按时间的先后顺序依次存入(有的时候也会采用LRLRLR方式存储,只是另一个声道的数据为0),如果是双声道的话就按照LRLRLR的方式存储,存储的时候还和机器的大小端有关。大端模式如下图所示:
RealAudio
Real Audio是Real networks推出的一种音乐压缩格式,它的压缩比可达到1:96,因此在网上比较流行。经过压缩的音乐文件可以在通过速率为14.4kbps的 Modem上网的计算机中流畅回放,其最大特点是可以实现网上实时回访,也就是说边下载边播放。
网络中非常常见,在rmvb、rm封装格式中,或者是.ra 、.ram音频文件,由RealNetworks发展的一种多媒体音频文件格式,目前已有很多版本:
lpcJ, 14_4: IS-54 VSELP (RealAudio 1)
28_8: G.728 LD-CELP (RealAudio 2)
dnet: Dolby AC3 (RealAudio 3)
sipr: Sipro Lab Telecom ACELP-NET (RealAudio 4/5)
cook: G2/Cook Codec (RealAudio 6)
atrc: Sony ATRAC3 (RealAudio 8)
raac: MPEG-4 LC-AAC (RealAudio 9)
racp: MPEG-4 HE-AAC (RealAudio 10)
ralf: RealAudio Lossless Format (RealAudio 10)