音视频的文件封装——AVI、MP4、MKV

1.AVI(Audio Video Interleave)

由微软在 1992 年 11 月推出的一种多媒体文件格式, AVI 文件通常不进行压缩或使用无损压缩,因此文件体积相对较大。尽管AVI 已经属于老旧的技术,但是由于 Windows 的通用性,和简单易懂的开发 API ,仍被广泛使用。
AVI 的文件结构分为 " 头部 " , " 主体 " 和 " 索引 " 三部分。主体中图像数据和声音数据是交互存放的。从尾部的索引可以索引跳到自己想放的位置。
AVI 将视频和音频封装在一个文件里,其顺序是:若干视频帧( Video Frame )之后接着若干音频帧(Audio Frame ),再然后是视频帧、音频帧,故名为 " 音频视频交织 " ,意即音频和视频按帧交错排列,以此达到音频同步于视频播放的效果。

1.1****基础文件格式

在 AVI 文件中,有两种最基础的结构,分别是 chunk 和 list 。
Chunk 是用来描述音频 / 视频 / 字幕等数据,其结构如下所示:

Chunk 标志是由 4 字节 ASCII 码标识符的 FOURCC 编码组成,在 Chunk 标志中的 FOURCC 编码是由一个两位数的流编号和一个定义区块中信息类型的双字符代码。

例如,如果流 0 包含音频,则该流的数据区块将具有 FOURCC"00wb" 。 如果流 1 包含视频,则该流的数据区块将具有 FOURCC"01db" 或 "01dc" 。
LIST 其实用来包含多个 Chunks 或者多个 LIST ,其结构如下所示:

chunk 和 list 的设计主要是为了组织和管理数据。我们可以把它们想象成文件夹和文件:

  • chunk:就像一个文件,包含具体的数据,比如一段视频帧或音频样本。每个chunk都有一个ID和数据内容。

  • list:就像一个文件夹,可以包含多个chunk或其他list。list有一个ID,表示它包含的内容类型,比如视频数据、音频数据等。

1.2 AVI****主要结构

一个完整的 AVI 文件通常由如下几个子块组成:

  • ID为"AVI"的RIFF,文件头
  • ID为"hdrl"的list,信息块,包含了音视频信息,描述媒体流信息
  • ID为"info"的list,包含编码该AVI的程序信息
  • ID为"junk"的chunk,无用的数据,用于字节对齐
  • ID为"movi"的list,数据块,包含了交错排列的音视频数据
  • ID为"idx1"的chunk,索引块,包含音视频排列的索引数据(可选块,不存在时seek会慢很多)
1.2.1 hdrl****信息块
  • 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****位图信息头部
  • 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****音频信息头部
  • wFormatTag:编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
  • nChannels:声道数
  • nSamplesPerSec: 采样率
  • nAvgBytesPerSec:每秒的数据量
  • nBlockAlign: 数据块对齐标志
  • wBitsPerSample: 每次采样的数据量
  • cbSize:大小
1.2.5 movi****数据块


在 movi 中存储音视频数据,以交错方式进行存放,其中音视频子块的种类有: db( 未压缩的视频
帧 )/dc( 压缩的视频帧 )/wb( 音频数据 )/pc( 使用调色板 )
对于 dc 类型且存放 H264 码流的文件格式为:

对于 wb 类型且存放 adts 码流的文件格式为:

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

相关推荐
优联前端2 小时前
Web 音视频(四)在浏览器中处理音频
开发语言·javascript·音视频·优联前端·webav·webcodecs
好奇心害死薛猫6 小时前
关于视频字幕
音视频
山河君15 小时前
音频进阶学习十一——离散傅里叶级数DFS
学习·音视频·信号处理
学习嵌入式的小羊~16 小时前
音视频流媒体中的实 时 流式 传 输 (Realtime (progressive streaming)。streaming )和 顺 序 流式 传 输
ffmpeg·音视频
Leon_Chenl2 天前
FFmpeg 头文件完美翻译之 libavdevice 模块
ffmpeg·音视频·c·编解码·libavdevice
云空2 天前
《DeepSeek R1:7b 写一个python程序调用摄像头获取视频并显示》
开发语言·python·音视频
我的青春不太冷2 天前
【实战篇】Android安卓本地离线实现视频检测人脸
android·数码相机·ai·人脸识别·音视频·android人脸识别
我的青春不太冷2 天前
【OpenCV实战】混合运动跟踪算法的视频目标轨迹可视化系统设计与实现
人工智能·深度学习·opencv·算法·计算机视觉·音视频
EDPJ2 天前
(2025|ICLR,音频 LLM,蒸馏/ALLD,跨模态学习,语音质量评估,MOS)音频 LLM 可作为描述性语音质量评估器
人工智能·语言模型·音视频