aac格式介绍(ADTS)
aac的格式有两种:ADIF不常用,ADTS是主流,所以这里主要讲解ADTS。简单来说,ADTS可以在任意帧解码,也就是说它每⼀帧都有头信息。ADIF只有⼀个统⼀的header,所以必须得到所有的数据后解码。参考下图
⼀个AAC原始数据块⻓度是可变的,对原始帧加上ADTS头进⾏ADTS的封装,就形成了ADTS帧。参考下图
adts-header的长度一般为7字节,当protection_absent=0
时,表示需要校验码,此时的adts-header就会额外添加一个2字节的校验码,此时的adts-header长度就为9字节。
⼀般情况下ADTS的头信息都是7个字节,分为2部分:
其中,adts_fixed_header
为固定头信息,adts_variable_header
是可变头信息。固定头信息中的数据每⼀帧都相同,⽽可变头信息则在帧与帧之间不同。 参考下图
注:ADTS Header的长度可能为7字节或9字节,当protection_absent字段为时,表示需要校验码,此时是9字节;否则为7字节。
常见的header字段如下:
这里只是对aac格式的简单介绍,想要了解更多内容,参考:AAC-ADTS格式分析【转载】-CSDN博客
h264格式分析
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。
H264主要分为两层:编码层(Video Coding Layer,VCL)和网络抽象层(NetworkAbstraction Layer (NAL));前者定义了各种编码的算法,后者将前者编码的数据按照一定的方式进行打包存储或者传输。而NAL单元(NALU)作为可以单独可以解码的结构,整个H264的码流可以理解为由多个NALU组成的。这里我们主要介绍NALU。
先来认识一些相关概念
H.264/AVC只是定义了一种标准,常见的具体格式有两种:AnnexB格式和AVCC格式。AnnexB格式主要用于实时播放(.h264文件就是这种格式),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的区别在于:
这里主要介绍AnnexB格式和AVCC格式的区别,想要了解H264-NALU的结构,可以参考:H264基础简介【转载】-CSDN博客,这篇博客以AnnexB格式为例,介绍了h264的格式。
FLV和MP4格式介绍
- FLV格式
FLV封装格式是由⼀个⽂件头(file header)和 ⽂件体(file Body)组成。其中,FLV body由⼀对对的(Previous Tag Size字段 + tag)组成。Previous Tag Size字段 排列在Tag之前,占⽤4个字节。Previous Tag Size记录了前⾯⼀个Tag的⼤⼩,⽤于逆向读取处理。FLV header后的第⼀个Pervious Tag Size的值为0。 参考下图
这里只是对flv格式的简单介绍,详情参考:FLV文件格式分析【转载】-CSDN博客
- MP4格式
MP4协议本身没有多复杂,没啥特别难理解的地方,关键的“复杂”点就在于其“大”,嵌套的各种各样的子box。详情参考:整理mp4协议重点【转载】-CSDN博客