常见音视频格式详解:AAC、H264、FLV与MP4
常见音视频格式详解:AAC、H264、FLV与MP4
在多媒体应用日益普及的今天,了解常见的音视频格式对于开发者和爱好者来说都非常重要。本文将详细介绍AAC、H264、FLV和MP4这四种常用音视频格式的基本知识,帮助读者更好地理解和应用这些格式。
AAC格式分析
AAC(Advanced Audio Coding)格式主要有两种:ADIF(Audio Data Interchange Format)和ADTS(Audio Data Transport Stream)。其中,ADTS是主流格式,因为它的每帧都有头信息,支持随机访问解码。
一个AAC原始数据块长度是可变的,对原始帧加上ADTS头进行ADTS封装,就形成了ADTS帧。ADTS头的长度一般为7字节,当protection_absent
字段为0时,表示需要校验码,此时的ADTS头就会额外添加一个2字节的校验码,总长度变为9字节。
ADTS头信息分为两部分:
adts_fixed_header
:固定头信息,每帧都相同adts_variable_header
:可变头信息,帧与帧之间不同
常用的ADTS头字段包括:
- 同步字(syncword):2个字节(16位),用于确定音频帧的开始位置
- ID(MPEG Version):1个字节(8位),指示使用的MPEG版本
- Layer:2个比特,定义音频流所属的层级
- Protection Absent:1个比特,指示是否启用CRC错误校验
- Profile:2个比特,指示编码所使用的AAC规范类型
- Sampling Frequency Index:4个比特,表示采样率的索引
- Channel Configuration:3个比特,指示音频的通道数
H264格式分析
H.264标准从1999年开始制定,2003年形成草案,2007年最终定稿。在ITU标准中称为H.264,在MPEG标准中是MPEG-4的一部分,也称为MPEG-4 AVC或AVC。
H264主要分为两层:编码层(Video Coding Layer,VCL)和网络抽象层(Network Abstraction Layer,NAL)。其中,NAL单元(NALU)是可单独解码的结构,整个H264码流可以理解为由多个NALU组成。
一些相关概念:
- SPS(Sequence Parameter Set):保存一组编码视频序列的全局参数
- PPS(Picture Parameter Set):对应于序列中某一幅或多幅图像的参数
- I帧:帧内编码帧,可独立解码生成完整图片
- P帧:前向预测编码帧,需要参考前面的I帧或P帧
- B帧:双向预测内插编码帧,需要参考前后两个参考帧
- GOP(Group of Pictures):一组连续的视频帧,用于提高压缩效率和随机访问支持
常见的H264具体格式有两种:AnnexB格式和AVCC格式。AnnexB格式主要用于实时播放,而AVCC格式主要用于视频存储。
AnnexB格式
[start code]NALU | [start code] NALU | ...
SPS和PPS被嵌入到视频流中,其本身也是一种NALU。这种格式比较常见,每个帧前面都有0x00 00 00 01或0x00 00 01作为起始码。
AVCC格式
([extradata]) | ([length] NALU) | ([length] NALU) | ...
这里的NALU一般没有SPS PPS等参数信息,参数信息属于extradata位于文件的头部。比如ffmpeg中解析mp4文件后SPS PPS存在streams[index]->codecpar->extradata
中。
AnnexB和AVCC的主要区别在于:
- NALU之间的分隔方式不同:AnnexB通过start code分隔,AVCC通过长度前缀
- SPS和PPS的位置不同:AnnexB嵌入到视频流中,AVCC放在文件头部
FLV和MP4格式介绍
FLV格式
FLV封装格式由文件头(file header)和文件体(file Body)组成。文件体由一对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段排列在Tag之前,占用4个字节,记录了前面一个Tag的大小,用于逆向读取处理。FLV header后的第一个Pervious Tag Size的值为0。
MP4格式
MP4协议本身并不复杂,关键的“复杂”点在于其嵌套的各种子box。MP4通过Box结构来组织数据,每个Box包含一个头部和一个数据区,头部描述Box的类型和大小。