有关AVI的两个问题
AVI:音频视频交错格式
AVI格式中,音频和视频是交织存放的。其规律是每15段video后接1段audio,而每经过两次这样的循环就需要16段video后才接1段audio。
AVI中的视频和音频数据块
视频:视频帧头+视频帧长度+视频帧数据
视频头(30 30 64 63) | 长度(4B) | 数据 |
音频:音频头+音频长度+音频数据
音频头(30 31 77 62) | 长度(00 10 00 00) | 数 |
WAV文件格式分析
WAV文件简介
WAV文件是由微软公司专门为Windows开发的一种数字音频文件,能够记录单声道或立体声的声音信息,并且能够保证声音不失真。WAV符合资源互换文件格式(RIFF)规范,可以看作是RIFF的一种具体实例,支持MSADPCM、CCITT A律、CCITT μ律等压缩算法。但由于其文件尺寸较大,占用磁盘空间过大,所以多用于存储较短的声音片段。
WAV的存储过程大致为:
声源发出的声波通过话筒被转换成连续变化的电信号,经过放大、抗混叠滤波后,按固定的频率进行采样,每个样本是在一个采样周期内检测到的电信号幅度值;接下来将其由模拟电信号量化为由二进制数表示的积分值;最后编码并存储为音频流数据。有的应用为了节省存储空间,存储前,还要对采样数据先进行压缩。
格式分析
WAV文件遵循RIFF规则,其内容以区块(chunk)为最小单位进行存储。一个WAV文件通常有三个chunk以及一个可选chunk,其在文件中的排列方式依次是:RIFF chunk,Format chunk,Fact chunk(附加块,可选),Data chunk。
RIFF区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
ID | 0x00 | 4B | 大端 | 52 49 46 46 (0x) |
Size | 0x04 | 4B | 小端 | RIFF区块大小 |
Type | 0x08 | 4B | 大端 | 57 41 56 45 (0x) |
Note:
- Size是整个文件的长度剪去8B(ID+Size共8B)
- Type为WAVE时,后面需要两个子块:FORMAT、DATA
FORMAT区块
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
ID | 0x00 | 4B | 大端 | 66 6D 74 20 (0x) |
Size | 0x04 | 4B | 小端 | 16 |
AudioFormat | 0x08 | 2B | 小端 | 音频格式 |
NumChannels | 0x0A | 2B | 小端 | 声道数 |
SampleRate | 0x0C | 4B | 小端 | 采样率 |
ByteRate | 0x10 | 4B | 小端 | 每秒数据字节数 |
BlockAlign | 0x14 | 2B | 小端 | 数据块对齐 |
BitsPerSample | 0x16 | 2B | 小端 | 采样位数 |
Note;
- Size:区块数据长度(不包括ID和Size)
- AudioFormat:Data区块存储的音频数据的格式,具体取值如下表
格式代码 | 格式 | 对应Format块长度 |
0x0001 | PCM/非压缩格式 | 16 |
0x0002 | Microsoft ADPCM | 18 |
0x0003 | IEEE float | 18 |
0x0006 | ITU G.711 a-law | 18 |
0x0007 | ITU G.711 μ-law | 18 |
0x0031 (49) | GSM 6.10 | 20 |
0x0040 (64) | ITU G.721 ADPCM |
|
- NumChannels:音频数据的声道数,1:单声道,2:双声道
- SampleRate:音频数据的采样率
- ByteRate:每秒数据字节数 = SampleRate * NumChannels * BitsPerSample / 8
- BlockAlign:每个采样所需的字节数 = NumChannels * BitsPerSample / 8
- BitsPerSample:每个采样存储的bit数,8:8bit,16:16bit,32:32bit
FACT区块
采用压缩编码的WAV文件必须要有FACT区块。FACT块中只存储每个声道的采样总数。
名称 | 字节数 | 内容 |
ID | 4B | 66 61 63 74 (0x) |
Size | 数据长,最小为4B | 数据长度 |
采样总数 | 可变 | 每个声道采样总数 |
DATA区块
Data块中存放的是音频的采样数据。每个sample按照采样的时间顺序写入,对于使用多个字节的sample,使用小端模式存放(低位字节存放在低地址,高位字节存放在高地址)。对于多声道的sample采用交叉存放的方式。例如:立体双声道的sample存储顺序为:声道1的第一个sample,声道2的第一个sample;声道1的第二个sample,声道2的第二个sample;依次类推....。对于PCM数据,有以下两种的存储方式:
- 单声道,量化比特数为8,使用偏移二进制码
- 除单声道外,使用补码方式存储
名称 | 偏移地址 | 字节数 | 端序 | 内容 |
ID | 0x00 | 4B | 大端 | 64 61 74 61 (0x) |
Size | 0x04 | 4B | 小端 | 可变 |
Data | 0x08 | 可变 | 小端 | 音频数据 |
Note:
- Size:音频数据长度,等于比特率乘以时长
小端存储
- 大端存储模式:数据的地位保存在哪存的高地址中,数据的高位保存在内存的低地址中
- 小端存储模式:数据的地位保存在哪存的低地址中,数据的高位保存在内存的高地址中;WAV文件正是以小端模式进行存储的
实例分析
RIFF块
- 53 49 46 46:ID标识(RIFF)
- 50 20 04 00:数据长度,小端存储,00 04 20 50,270416bit=33802B≈33.0098KB
- 57 41 56 45:类型:WAVE
FORMAT块
- 66 6D 74 20:ID标识(fmt )
- 10 00 00 00:数据长度
- 01 00:小端存储(对应大端存储模式为00 01),PCM编码格式
- 01 00:音频数据的声道数,小端存储,对应单声道
- 80 BB 00 00:音频采样率,小端存储,采样率为48000
- 00 77 01 00:每秒字节数,小端存储,164+7*163+7*162=96000 bps
- 02 00:每个采样所需的字节数,小端存储,2B
- 10 00:每个采样存储比特数,小端存储,16bit
DATA块
- 64 61 74 61:ID标识(data)
- 00 20 04 00:数据长度,小端存储,270336bit=33792B=33KB