1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > FFmpeg之音频封装格式 音频编解码器

FFmpeg之音频封装格式 音频编解码器

时间:2022-10-25 14:24:15

相关推荐

FFmpeg之音频封装格式 音频编解码器

语音基础知识:/editor/html/111210192

音频封装格式

无损压缩

无损压缩指的是在无损格式之间的压缩(转换),无论压缩(转换)成什么格式,音质都是相同的,并且都能还原成最初同样的文件。平时所说的无损均是指无损压缩,没有无损码率的说法。对于各种格式的压缩都是对应着一种算法(或者说编码),播放的时候需要有解码器进行译码,而且不同的解码器也可能会影响解压出来的文件完整性。常见的无损格式有:

wav:微软公司的一种声音文件格式,是无压缩的最接近真实声音的格式(其次是midi),支持多采样率多量化精度。所有的无损格式本质都是wav的压缩,在播放时会转回wav。

flac:Free Lossless Audio Coded,是国际通用格式,特点是压缩比高,编码算法也相当成熟,当flac文件受损时依然能正常播放。另外,该格式也是最先得到广泛硬件支持的无损格式。

ape:使用Monkey‘s Audio软件对CD抓轨而转换成的文件格式,但优势并不突出,解码较慢。

wma-lossless:也是微软公司出品,特点是压缩比高,但未成为主流。

aiff:苹果公司出品,是Apple苹果电脑上面的标准音频格式。

DSD:Sony大法的,不是很了解,欣赏不来辣种文化,但就说单纯的冲,还是要冲的。

有损压缩

有损压缩指的是声音信息在压缩过程中发生了丢失,且所丢失的声音无法用采样率和位数表示出来。但特点就是压缩后的文件变的很小,常在流媒体中使用。常见的有损格式有:

mp3:模拟人耳听觉研究出的一种复杂算法,被称为“心理声学模型”。它通过抽取音频中的一些频段来达到提高压缩比,降低码率,减少所占空间,但同时声音的细节如人声的情感、后期的混响等等都已经发生变形。盲听的话也很难较快地分辨出wav和mp3,需要借助设备。mp3目前是最为普及的声频压缩格式,可以最大程度地保留压缩前的音质。

wma:微软公司力作,不开放,哟版权。特点是在较低比特率下(如64kbps),wma可以在与mp3相同的音质条件下获得更小的体积。并且在超低比特率(如16kbps),wma音质比mp3要好得多。

aac:苹果电脑上的声音文件储存格式。

ogg:完全免费、开放和没有专利限制,但普及性较差。

m4a:M4A是MPEG-4 音频标准的文件的扩展名,最常用的.m4a文件是使用AAC格式的(文件),不过其他的格式,比如Apple Lossless甚至mp3也可以被放在.m4a容器里(TC注:这个container的概念类似于.mkv文件)。可以安全地把只包含音频的.mp4 文件的扩展名改成.m4a。

*************aac***********

我们采用的是脉冲代码调制编码,即PCM编码。它是一种将模拟语音信号转换为数字信号的编码方式,是无损非压缩编码。PCM通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字编码(最后输出一组二进制数据,就是PCM格式的数据,该文件没有附加的文件头和文件结束标志)。PCM又称为脉冲调制数据,是计算机可以播放的最原始数据。

ADTS可以在任意帧解码,也就是说它每一帧都有头信息。ADIF只有一个统一的头,所以必须得到所有的数据后解码。且这两种的header的格式也是不同的,目前一般编码后的和抽取出的都是ADTS格式的音频流。

AAC原始流能让ffmpeg软解或系统硬解码,需要在ES流前面加上ADTS头,打包成ADTS的格式,一般是在AAC ES流前添加7个字节的ADTS header。

AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成。/zhangxuan/p/8809245.html

一般情况下ADTS的头信息是7个字节,分为2部分:

抽样:对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号;量化:用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示;编码:用一组二进制码组来表示每一个有固定电平的量化值;

采样后的数据大小 = 采样率值×采样大小值×声道数 bps。

一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率=44.1K×16×2 bps=1411.2 Kbps= 176.4 KB/s。

AAC是高级音频编码(Advanced Audio Coding)的缩写,出现于1997年,最初是基于MPEG-2的音频编码技术。由Fraunhofer IIS、Dolby Laboratories、AT&T、Sony等公司共同开发,目的是取代MP3格式。2000年,MPEG-4标准出台,AAC重新集成了其它技术(PS,SBR),为区别于传统的MPEG-2 AAC,故含有SBR或PS特性的AAC又称为MPEG-4 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共有9种规格,以适应不同的场合的需要:

MPEG-2 AAC LC 低复杂度规格(Low Complexity)--比较简单,没有增益控制,但提高了

编码效率,在中等码率的编码效率以及音质方面,都能找到平衡点

MPEG-2 AAC Main 主规格

MPEG-2 AAC SSR 可变采样率规格(Scaleable Sample Rate)

MPEG-4 AAC LC 低复杂度规格(Low Complexity)------现在的手机比较常见的MP4文件中的音频部份就包括了该规格音频文件

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)-----这种规格适合用于低码率编码,有Nero ACC 编码器支持

目前使用最多的是LC和HE(适合低码率)。流行的Nero AAC编码程序只支持LC,HE,HEv2这三种规格,编码后的AAC音频,规格显示都是LC。HE其实就是AAC(LC)+SBR技术,HEv2就是AAC(LC)+SBR+PS技术;

AAC音频文件(传输流)格式有ADIF和ADTS:ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

adts_fixed_header();固定的头部

adts_variable_header();可变的头部

syncword:同步头 总是0xFFF, all bits must be 1,代表着一个ADTS帧的开始

ID:MPEG标识符,0标识MPEG-4,1标识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。有些芯片只支持AAC LC 。

在MPEG-2 AAC中定义了3种:

sampling_frequency_index:表示使用的采样率下标,通过这个下标在Sampling Frequencies[ ]数组中查找得知采样率的值。

channel_configuration:表示声道数

frame_length: 一个ADTS帧的长度包括ADTS头和AAC原始流.

adts_buffer_fullness:0x7FF 说明是码率可变的码流

在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: Advanced Audio Coding 高级音频编码

AAC LC: AAC with Low Complexity AAC的低复杂度配置

AAC plus: 也叫HE-AAC, AAC+,MPEG4 AAC LC加入SBR模块后形成的一个AAC版本

MPEG:Motion Picture Expert Group

IMDCT:反离散余弦变换

ADIF:Audio Data Interchange Format 音频数据交换格式

ADTS:Audio Data Transport Stream 音频数据传输流

SCE: Single Channel Element单通道元素

CPE: Channel Pair Element 双通道元素

CCE: Coupling Channel Element 藕合通道元素

DSE: Data Stream Element 数据流元素

PCE: Program Config Element 程序配置元素

FIL: Fill Element 填充元素

ICS: Individual Channel Stream 独立通道流

PNS: Perceptual Noise Substitution 知觉噪声替换

SBR: Spectral Band Replication 频段复制

TNS: Temporal Noise Shaping 瞬时噪声整形

ch:channel 通道

PS:parametric stereo 参数立体声

SBR:Spectral Band Replication 频段复制

********MP3*********

Layer-3音频文件,MPEG(Moving Picture Experts Group) 在汉语中译为活动图像专家组,特指活动影音压缩标准,MPEG音频文件是MPEG1 标准中的声音部分,也叫MPEG 音频层,它根据压缩质量和编码复杂程度划分为三层,即Layer-1、Layer2、Layer3,且分别对应MP1、MP2、MP3 这三种声音文件,并根据不同的用途,使用不同层次的编码。MPEG 音频编码的层次越高,编码器越复杂,压缩率也越高,MP1 和MP2 的压缩率分别为4:1 和6:1-8:1,而MP3 的压缩率则高达10:1-12:1,也就是说,一分钟CD 音质的音乐,未经压缩需要10MB的存储空间,而经过MP3 压缩编码后只有1MB 左右。不过MP3 对音频信号采用的是有损压缩方式,为了降低声音失真度,MP3采取了“感官编码技术”,即编码时先对音频文件进行频谱分析,然后用过滤器滤掉噪音电平,接着通过量化的方式将剩下的每一位打散排列,最后形成具有较高压缩比的MP3 文件,并使压缩后的文件在回放时能够达到比较接近原音源的声音效果。

ID3V2.

每个ID3V2.3 都一个标签头和若干个标签帧或一个扩展标签头组成关于曲目的信息如标题、作者等都存放在不同的标签帧中,扩展标签头和标签帧并不是必要的,但每个标签至少要有一个标签帧。标签头和标签帧一起顺序存放在MP3 文件的首部。

标签头:位于文件开始处,长度为10字节,结构如下:

标签帧:每个标签帧都有10个字节的帧头(和标签头不是一个东西,虽然他们刚好都是10字节,标签头只有一个,每个标签帧都有一个帧头)和至少一个字节的内容构成,标签帧与标签头/其他标签帧无特殊字节分割,只能通过帧头信息来确定帧内容的大小。

标签帧的帧头结构:

MP3音频数据(除了ID3v2和ID3v1之外的数据)

MP3的帧格式:每个帧都有一个帧头Header,长度是4Byte(32bit),帧头后面可能有两个字节的CRC 校验值,这两个字节的是否存在决定于Header 信息的第16bit,为0 则帧头后面无校验,为1 则有校验,校验值长度为2 个字节,紧跟在Header 后面,接着就是帧的实体数据了。

帧头:帧头长4字节,对于固定位率的MP3文件,所有帧的帧头格式一样,如下:

V1 - MPEG 1 V2 - MPEG 2 and MPEG 2.5

L1 - Layer 1 L2 - Layer 2 L3 - Layer 3

"free"表示位率可变 "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.025kHz01-12kHz 10-8kHz 11-未定义

帧长调节

1

用来调整文件头长度,0-无需调整,1-调整,具体调整计算方法见下文。

保留字

1

没有使用。

声道模式

2

第4字节

表示声道,00-立体声Stereo 01-Joint Stereo 10-双声道 11-单声道

扩充模式

2

当声道模式为01是才使用。

版权

1

文件是否合法,0-不合法 1-合法

原版标志

1

是否原版, 0-非原版 1-原版

强调方式

2

用于声音经降噪压缩后再补偿的分类,很少用到,今后也可能不会用。

00-未定义 01-50/15ms 10-保留 11-CCITT J.17

MP3帧长取决于位率和频率,

计算帧长度

我们首先区分两个术语:帧大小和帧长度。帧大小即每帧采样数表示一帧中采样的个数,这是恒定值。其值如下表所示

帧长度是压缩时每一帧的长度,包括帧头。它将填充的空位也计算在内。LayerI的一个空位长4字节,LayerII和LayerIII的空位是1字节。当读取MPEG文件时必须计算该值以便找到相邻的帧。注意:因为有填充和比特率变换,帧长度可能变化。

从头中读取比特率,采样频率和填充的值后可以进行计算,

LyaerI使用公式:

帧长度(字节) = (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充 * 4

LyerII和LyaerIII使用公式:

帧长度(字节)= (( 每帧采样数/ 8 * 比特率 ) / 采样频率 ) + 填充

例:

LayerIII 比特率 128000,采样频率 44100,填充0 =〉帧大小 417字节;

如图 2.3中,比特率为128K,采样率为44.1K,填充0,则其帧长度为:

(1152 / 8 * 128K)/44.1K = 417 (字节)

每帧的持续时间

每帧的持续时间可以通过计算获得,下面给出计算公式

每帧持续时间(毫秒) = 每帧采样数 / 采样频率 * 1000

如图 2.3中,其每帧时间为:

1152 / 44.1K * 1000 = 26.12 (约等于26ms)

如果是MPEG2 Layer III 采样率为16KHz的话那一帧要持续36毫秒,这个相差还是蛮大的,所以还是应该通过计算来获的。

CRC校验

如果帧头的校验位为0,则帧头后就有一个16位的CRC值,这个值是big-endian的值,把这个值和该帧通过计算得出的CRC值进行比较就可以得知该帧是否有效。

帧头后面是可变长度的附加信息,对于标准的MP3文件来说,其长度是32字节,紧接其后的是压缩的声音数据,当解码器读到此处时就进行解码了。

对于mp3来说现在有两种编码方式,一种是CBR,也就是固定位率,固定位率的帧的大小在整个文件中都是是固定的,只要知道文件总长度,和从第一帧帧头读出的信息,就都可以通过计算得出这个mp3文件的信息,比如总的帧数,总的播放时间等等,要定位到某一帧或某个时间点也很方便,这种编码方式不需要文件头,第一帧开始就是音频数据。另一种是VBR,就是可变位率,VBR是XING公司推出的算法,所以在MP3的FRAME里会有“Xing"这个关键字(也有用"Info"来标识的),它存放在MP3文件中的第一个有效帧的数据区里,它标识了这个MP3文件是VBR的。同时第一个帧里存放了MP3文件的帧的总个数,这就很容易获得了播放总时间,同时还有100个字节存放了播放总时间的100个时间分段的帧索引,假设4分钟的MP3歌曲,240S,分成100段,每两个相邻INDEX的时间差就是2.4S,所以通过这个INDEX,只要前后处理少数的FRAME,就能快速找出我们需要快进的帧头。

VBR文件头位于MP3文件中第一个有效帧的数据区。有两种格式,一种是常见的XINGHeader(头部包含字符‘Xing’),另一种是VBRIHeader(头部包含字符‘VBRI’)鉴于VBRIHeader不常见,下面只说XINGHeader:

XING Header的起始位置,相对于第一帧帧头的位置,单位是字节

36-39 "Xing" 文件为MPEG1并且不是单声道(大多数VBR的mp3文件都是如此)

21-24 "Xing" 文件为MPEG1并且是单声道

21-24 "Xing" 文件为MPEG2并且不是单声道

13-16 "Xing" 文件为MPEG2并且是单声道

VBR文件头结构:

ID3v1

MP3的结尾,固定128字节;ID3V1 的各项信息都是顺序存放,没有任何标识将其分开,比如标题信息不足30 个字节,则使用''\0''填充。

MP3音乐类别:

实例分析:/u010650845/article/details/53520426

********wma********

wma是微软出的有损压缩,不对外开放,有版权限制,下面是头部解析:

******wav**********

无损格式

RIFF全称为资源互换文件格式(Resources Interchange File Format),RIFF文件是windows环境下大部分多媒体文件遵循的一种文件结构,常见的如WAV文件、AVI文件等。RIFF可以看成一种树状结构,其基本组成单元为LIST和CHUNK,分别如树的节点和叶子。

在RIFF文件中,数据保存的基本单元是CHUNK,可用于保存音视频数据或者一些参数信息,LIST相当于文件系统的目录,可以包含多个CHUNK或者多个LIST。

1、FOURCC

一个FOURCC(four character code)是一个占4个字节的数据,一般表示4个ASCII字符。在RIFF文件格式中,FOURCC非常普遍,LISTtype, chunkid, 起始标识等信息都是用FOURCC表示的。FOURCC一般是四个字符,如”abcd”这样的形式,也可以三个字符包含一个空格,如”abc ”这样的形式。

2、CHUNK

一个CHUNK数据块的数据结构如下:

ChunkID ChunkSize ChunkData

ChunkID是一个FOURCC,标识该CHUNK的名称,类似于windows文件系统中的文件名。 ChunkSize占用4个字节,表示ChunkData部分的数据内容大小,以字节为单位。ChunkData则是CHUNK中实质性的内容,保存的是CHUNK的具体数据内容。一个CHUNK保存的数据可以是关于声音文件的编码方式、音视频采样等信息,也可以是音频或视频数据。具体表示是哪类数据则通过ChunkID来标识。

3、LIST

一个LIST数据块的数据结构如下:

“LIST” ListSize ListType ListData

“LIST”也是一个FOURCC,而且是固定的,每个LIST都是以“LIST”为开头。ListSize占用4个字节,表示ListType和ListData两部分加在一起的大小。ListType是一个FOURCC,是对LIST具体包含的数据内容的标识。而ListData则是该LIST的数据内容区,有CHUNK和子LIST组成,它们的个数和组成次序可以是不确定的。

4、RIFF文件头

RIFF文件头的数据结构如下:

“RIFF” FileSize FileType FileData

“RIFF”也是一个FOURCC,用于标识该文件是一个RIFF格式的文件。FileSize是一个4字节的数据,给出文件的大小,但仅包括FileType和FileData两部分。FileType是一个FOURCC,用来说明文件类型,如”WAV”, “AVI”等。FileData部分表示文件的具体内容,可以是LIST也可以是CHUNK.

wav通常用来保存PCM格式的原始音频数据,所以通常被称为无损音频。但是严格意义上来讲,WAV也可以存储其它压缩格式的音频数据。WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。WAV文件一般由3个区块组成:RIFF chunkFormat chunk、Fact Chunk(可选)和Data chunk。另外,文件中还可能包含一些可选的区块,如:Fact chunkCue points chunkPlaylist chunkAssociated data list chunk等。

每个文件最前端写入的是RIFF块,每个文件只有一个RIFF块。从 Wave文件格式详细说明 中可以看到这一点。

非PCM格式的文件会至少多加入一个 "fact" 块,它用来记录数据(注意是数据而不是文件)解压缩后的大小。这个 "fact" 块一般加在 "data" 块的前面。

wav常见的结构:

RIFF区块

FORMAT区块

NumChannelsSampleRateBitsPerSample 三个参数最重要,其它的都是依据这三个计算出来的。

Fact

在非PCM格式的文件中(即压缩编码文件),一般会在WAVEFORMAT结构后面加入一个 "fact" chunk。

常见的压缩编码格式:

DATA区块

WAV文件以小端形式来进行数据存储。

所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。

******flac********

/yu_yuan_1314/article/details/9491763

block、subblock 指没有被编码的原始数据;frame、subframe指编码后的数据;

Block:一组或多组跨所有声道的采样点(flac采样组数范围16~65535)。

Subblock:一个或多个单声道的采样点,一个Block包含几个声道就有几个subblock,同个block内subblock的采样点数相同。

Blocksize:一个block中任意subblock的采样点个数(与声道数无关)。

Frame:一个frame帧头加一个或多个Subframe

Subframe:一个subframe帧头加某一声道上一个或多个编码后的采样点,一个frame中的所有subframe包含的采样点数一样。

(每次一个subblock被编码成一个subframe,多个subframe组成一个frame)

Flac中所有数值都是整形,大端模式,除非特别指出,否则数值都是unsigned的。

Flac比特流以“fLaC”开始,接着是必须的metadata块(STREAMINFO),然后是其他可选的metadata块,接着是音频帧。

Flac最多可以支持到128类metadata,已经定义的包括下面几种:

A. STREAMINFO:包含整个比特流的一些信息,如采样率、声道数、采样总数等。他一定是第一个metadata而且必须有。之后可以接其他metadata,这些metadata可以不用识别直接跳过。

B. APPLICATION:包含第三方应用软件信息,这个段里的32位识别码是flac维护组织提供的,是唯一的。

C. PADDING:没有意义的东西,主要用来后期添加其他metadata。

D. SEEKTABLE:保存快速定位点,一个点由18bytes组成(2k就可以精确到1%的定位),表里可以有任意多个定位点。

E. VORBIS_COMMENT:存储了一系列可读的“名/值”的键值对,使用UTF-8编码。这是flac唯一官方支持的标签段。

F. CUESHEET:存储用在cue sheet中的各种信息。可以用来划分音轨,在备份CD时十分有用。

G. PICTURE:保存相关图片,同时还有url、分辨率等信息,可以有不止一个picture block。

FLAC文件结构:

Metadata block结构:

音频数据由一个或多个音频帧组成.

Audio Frame结构:

*******aiff***********

http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/AIFF/AIFF.html

AIFF是由美国APPLE公司开发的无损音频格式,是Apple苹果电脑上面的标准音频格式,属于QuickTime技术的一部分。AIFF格式只能包含未经压缩的PCM格式的音频数据, AIFF文件包含以下几个区块(Chunk):Common Chunk (必需),Sound Data Chunk (必需),Marker Chunk,Instrument Chunk,Comment Chunk,Name Chunk,Author Chunk,Copyright Chunk,Annotation Chunk,Audio Recording Chunk,MIDI Data Chunk,Application Chunk,ID3 Chunk。

每个区块(Chunk)基本结构:

音频编解码协议

*******MP3*************

MP3的解码总体上可分为9个过程:比特流分析,霍夫曼编码,逆量化处理,立体声处理,频谱重排列,抗锯齿处理,IMDCT变换,子带合成,PCM输出。

********AAC**********

编解码流程:/fellow1988/p/7545881.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。