1.AVI(Audio Video Interleave)
由微软在 1992 年 11 月推出的一种多媒体文件格式, AVI 文件通常不进行压缩或使用无损压缩,因此文件体积相对较大。尽管AVI 已经属于老旧的技术,但是由于 Windows 的通用性,和简单易懂的开发 API ,仍被广泛使用。
AVI 的文件结构分为 “ 头部 ” , “ 主体 ” 和 “ 索引 ” 三部分。主体中图像数据和声音数据是交互存放的。从尾部的索引可以索引跳到自己想放的位置。
AVI 将视频和音频封装在一个文件里,其顺序是:若干视频帧( Video Frame )之后接着若干音频帧(Audio Frame ),再然后是视频帧、音频帧,故名为 “ 音频视频交织 ” ,意即音频和视频按帧交错排列,以此达到音频同步于视频播放的效果。
![](https://i-blog.csdnimg.cn/direct/4da75ca7eaeb43b5b752e0508afb39f3.png)
1.1 基础文件格式
在 AVI 文件中,有两种最基础的结构,分别是 chunk 和 list 。
Chunk 是用来描述音频 / 视频 / 字幕等数据,其结构如下所示:
![](https://i-blog.csdnimg.cn/direct/57cd53153e954b21a9be285a4309789e.png)
Chunk 标志是由 4 字节 ASCII 码标识符的 FOURCC 编码组成,在 Chunk 标志中的 FOURCC 编码是由一个两位数的流编号和一个定义区块中信息类型的双字符代码。
![](https://i-blog.csdnimg.cn/direct/cce31a8c514248868e3776e886133516.png)
例如,如果流 0 包含音频,则该流的数据区块将具有 FOURCC“00wb” 。 如果流 1 包含视频,则该流的数据区块将具有 FOURCC“01db” 或 “01dc” 。
LIST 其实用来包含多个 Chunks 或者多个 LIST ,其结构如下所示:
![](https://i-blog.csdnimg.cn/direct/cf51ff4e021b4c439d81ba710e0e6b70.png)
chunk 和 list 的设计主要是为了组织和管理数据。我们可以把它们想象成文件夹和文件:
- chunk:就像一个文件,包含具体的数据,比如一段视频帧或音频样本。每个chunk都有一个ID和数据内容。
- list:就像一个文件夹,可以包含多个chunk或其他list。list有一个ID,表示它包含的内容类型,比如视频数据、音频数据等。
1.2 AVI主要结构
一个完整的 AVI 文件通常由如下几个子块组成:
1.2.1 hdrl信息块
![](https://i-blog.csdnimg.cn/direct/e203744246ba47d9a2aaa2866acef0af.png)
- dwMicro SecPerFrame:每帧显示的时间 ns (通过测试了多个音频这个参数都是一样的,存疑!)
- dwMaxBytesPerSec:文件最大数据传输率
- dwFlags:AVI文件的特殊属性,包含文件中的任何标志字。如:有无索引块,是否是interlaced,是否含版权信息等
- dwTotalFrames:数据帧的总数
- dwInitialFrames:在开始播放前需要的帧数
- dwStreams:文件中包含的数据流种类
- dwSuggestedBufferSize:建议使用的缓冲区的大小,通常为存储一帧图像以及同步声音所需要的数据之和,大于最大的CHUNK的大小
- dwWidth:图像宽,像素
- dwHeight:图像高,像素
1.2.2 info封装流头部
- fccType:vids(视频数据流);auds(音频数据流);txts(字幕)
- fccHandler:编码器codec类型
- dwFlag:流属性,AVISF_DISABLED(流默认不激活);AVISF_VIDEO_PALCHANGES(流使用调色板进行视频帧调色)
- wPriority:流的播放优先级
- wLanguage:语言
- dwInitialFrames:流中第一个块block的编号
- dwScale:dwRate/dwScale ,对于视频来说,表示为帧率;对于音频来说,表示为采样率。
- DwRate:比特率
- dwState:开始播放的时间,VBR audio表示流起播放钱应该silent的时间。
- dwLength:文件长度
- dwSuggestedBufferSize :缓冲区大小
- dwSampleSize :流所占字节数,可用于计算 Chunk 时长。
- rcFrame :视频图像所占的矩形
1.2.3 info位图信息头部
![](https://i-blog.csdnimg.cn/direct/89a27451a69141219b466c981c6db070.png)
- biSize:位图结构体大小
- biWidth:位图宽度
- biHeight:位图高度
- biPlanes:颜色平面数,通常为1。这个字段几乎总是设置为1,因为大多数位图都是单一颜色平
- 面。
- biBitCount:颜色要用到的位数,1(黑白双色图);4(16色图);8(256色图);24(真彩色图)
- biCompression:位图是否被压缩
- biSizeImage:位图数据的大小
- biXPelsPerMeter:水平分辨率,以像素每米为单位。这个值指示图像在水平方向上的分辨率。
- biYPelsPerMeter:垂直分辨率,以像素每米为单位。这个值指示图像在垂直方向上的分辨率。
- biClrUsed:位图实际使用的颜色数。如果这个值为0,表示使用所有可能的颜色。
- biClrImportant:对图像显示有重要影响的颜色数。如果这个值为0,表示所有颜色都重要。
1.2.4 info音频信息头部
![](https://i-blog.csdnimg.cn/direct/fde3223c8d19475da3ea28aa373bc8cd.png)
- wFormatTag:编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
- nChannels:声道数
- nSamplesPerSec: 采样率
- nAvgBytesPerSec:每秒的数据量
- nBlockAlign: 数据块对齐标志
- wBitsPerSample: 每次采样的数据量
- cbSize:大小
1.2.5 movi数据块
![](https://i-blog.csdnimg.cn/direct/f37f8c7fa1414831ad14930948272d64.png)
帧 )/dc( 压缩的视频帧 )/wb( 音频数据 )/pc( 使用调色板 )
对于 dc 类型且存放 H264 码流的文件格式为:
![](https://i-blog.csdnimg.cn/direct/2c815da5b8614a7ebcbcd85c4d112dd0.png)
对于 wb 类型且存放 adts 码流的文件格式为:
![](https://i-blog.csdnimg.cn/direct/8da442260fd7415f9684bf20f52cf212.png)
1.2.6 idx1索引块
索引块是可选的,其主要功能是描述音视频数据的索引信息,在 1.2.2 info 封装流头部的 flag 中有指定是否包含索引块。当一个AVI 文件中有索引块可以快速的进行视频的快进,没有索引块需要重新计算位置。
索引块中包含每一个流的每一个索引信息,也就是它和movi数据块是对应的。
1.3 封装H264码流和AAC码流
使用FFMPEG库合成H264视频和AAC音频
ffmpeg -i input.h264 -i input.aac -c:v copy -c:a copy output.avi
输出文件的持续时间与最短的输入流匹配
ffmpeg -i input.h264 -i input.aac -c:v copy -c:a copy -shortest output.avi