音视频的文件封装——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

相关推荐
算家云几秒前
AI音频核爆!Kimi开源“六边形战士”Kimi-Audio,ChatGPT语音版?
人工智能·音视频·kimi·算家云·kimi-audio·租算力,到算家云
Everbrilliant892 小时前
音视频之H.265/HEVC熵编码
音视频·h.265·算术编码·哈夫曼编码·熵编码·指数哥伦布编码·熵编码的基本原理
Panesle3 小时前
月之暗面开源-音频理解、生成和对话生成模型:Kimi-Audio-7B-Instruct
人工智能·音视频·语音生成
Antonio9154 小时前
【音视频】音频编码实战
ffmpeg·音视频
BO_S__13 小时前
python调用ffmpeg对截取视频片段,可批量处理
python·ffmpeg·音视频
亦双城的双子娴14 小时前
通过音频的pcm数据格式利用canvas绘制音频波形图
音视频·pcm·canva可画
Antonio91518 小时前
【音视频】⾳频处理基本概念及⾳频重采样
ffmpeg·音视频·aac
电子科技圈19 小时前
XMOS空间音频——在任何设备上都能提供3D沉浸式空间音频且实现更安全地聆听
经验分享·设计模式·性能优化·计算机外设·音视频
18538162800余。1 天前
碰一碰发视频源码搭建全解析,支持OEM
音视频
聂 可 以1 天前
推荐几个免费提取音视频文案的工具(SRT格式、通义千问、飞书妙记、VideoCaptioner、AsrTools)
音视频·飞书·开源软件