问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

常见音视频格式详解:AAC、H264、FLV与MP4

创作时间:
作者:
@小白创作中心

常见音视频格式详解:AAC、H264、FLV与MP4

引用
CSDN
1.
https://blog.csdn.net/m0_73759312/article/details/143232646

在多媒体应用日益普及的今天,了解常见的音视频格式对于开发者和爱好者来说都非常重要。本文将详细介绍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头信息分为两部分:

  1. adts_fixed_header:固定头信息,每帧都相同
  2. 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的主要区别在于:

  1. NALU之间的分隔方式不同:AnnexB通过start code分隔,AVCC通过长度前缀
  2. 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的类型和大小。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号