AAC ADTS 格式分析
音频格式(Advanced Audio Coding)
ADTS
是AAC
音频的传输流格式,这种格式的特征是它是一个有同步字的比特流,
解码可以在这个流中任何地方开始。
ADTS
的头信息就是能支持任意帧解码的关键。
`ADTS`的头信息都包含了每一帧的音频采样率、声道、帧长度等关键信息,从而让解码器能够解析读取。
如上图所示,ADTS
的头信息分两部分:
adts_fixed_header()
;//固定的头部信息adts_variable_header()
;//可变的头部信息
固定头信息的细节(部分)分析:
- syncword,同步头总是0xFFF代表着ADTS帧的开始:
- ID,MPEG标识符,0标识MPEG-4,1标识MPEG-2;
- Layer,通常都是’00’;
- protection_absent,表示是否误码校验;
- profile,表示使用哪个级别的AAC;
- sampling_frequency_index,表示使用的采样率下标;
- channel_configuration,表示声道数
可变头信息的细节(部分)分析:
- aac_frame_length,一个ADTS帧的长度(包括ADTS头和AAC原始流),通过是否存在误码校验来判断长度是7还是9个字节:
- adts_buffer_fullness,值为0x7FF则表示可变码率的码流;
- number_of_raw_data_blocks_in_frame,表示ADTS帧中有 number_of_raw_data_blocks_in_frame + 1个AAC原始帧。
MP3 格式分析
MPEG Audio Layer 3
音频压缩包,文件大体上可分为三个部分:
ID3V2
位于MP3
文件头部,记录了作者,作曲,专辑等信息,拓展了ID3V1
的信息量,长度可变,是由:
- 标签头(一个):长度为
10
个字节;- 标签帧(若干):都有
10
个字节的帧头和至少1
个字节的内容构成- 音频数据,具体细节分布如下:
- 帧头:占
4
字节,记录同步信息,版本,层,CRC
校验等信息;CRC
:一般为2
字节- 通道信息
(Side info)
:ID3V1
一般将文件末尾最后的128
字节来存放ID3
信息.
下面以<天地孤影任我行.mp3>为例:
拓展学习:
Mp3 文件结构全解析 (一)这个链接里面还有多个拓展链接参考
Mp3 文件结构全解析 (二)
H264 NALU分析
NALU
的组成结构:
SPS
,序列参数集;PPS
, 图像参数集;I Frame
帧内编码帧;P Frame
前向预测编码帧;B Frame
双向预测编码帧
NALU
的功能分为两层,VCL
和NAL
VCL
视频编码层,包括核心压缩引擎和块,宏块和片的语法级别定义。NAL
网络提取层,负责将视频编码层产生的比特字符串适配到各种各样的网络和多元环境中,覆盖了所有片级以上的语法级别。
一个
NALU
= 一组对应于视频编码的NALU
头信息 + 一个RBSP(Raw Byte Sequence Payload)
再细分NALU
头信息:
- T: 表示负荷数据类型,如图所示占
5 bit
- R: 重要性指示位,占
2 bit
- F: 禁止位,占
1 bit
AVBitStreamFilter
typedef struct AVBitStreamFilter {
const char *name;
/**
* A list of codec ids supported by the filter, terminated by
* AV_CODEC_ID_NONE.
* May be NULL, in that case the bitstream filter works with any codec id.
*/
const enum AVCodecID *codec_ids;
/**
* A class for the private data, used to declare bitstream filter private
* AVOptions. This field is NULL for bitstream filters that do not declare
* any options.
*
* If this field is non-NULL, the first member of the filter private data
* must be a pointer to AVClass, which will be set by libavcodec generic
* code to this class.
*/
const AVClass *priv_class;
/*****************************************************************
* No fields below this line are part of the public API. They
* may not be used outside of libavcodec and can be changed and
* removed at will.
* New public fields should be added right above.
*****************************************************************
*/
int priv_data_size;
int (*init)(AVBSFContext *ctx);
int (*filter)(AVBSFContext *ctx, AVPacket *pkt);
void (*close)(AVBSFContext *ctx);
void (*flush)(AVBSFContext *ctx);
}
拓展学习:
H264编解码框图
FLV 格式
是由一个文件头和文件体组成的格式:
- 文件体(
file Body
)又是由一对对的Previous Tag Size字段 + tag组成. - 文件头(
file Header
)之后的第一个Previous Tag Size字段的值为0. - Previous Tag Size字段在
tag
之前,占用4个字节.它记录了前一个tag
的大小,用来逆向读取处理. - tag一般分为三种类型,脚本(帧)数据类型,音频数据类型,视频数据类型.
tag
它们的头部tag Header
结构都一样(参照上图),但类型不同,自然数据区域就不一样了:
MateData Tag
的数据区域结构主要用来描述视频或音频信息的数据,比如采样,声道,频率等信息;
- 第一个
AMF
包,一般为三个字节:
- 第1个字节总是
0x22
,表示字符串;- 第2~3个字节用来标识字符串的长度,一般总是
0x000A
;- 最后就是字符串的内容了,一般总是
onMetaData(6F,6E,4D,65,74,61,44,61,74,61)
.- 第二个
AMF
包
- 第1个字节表示
AMF
包的类型,一般总是0x08
,表示数组;- 第2~5个字节表示数组元素的个数;
- 最后即为个数组元素的封装了,数组元素是由元素名称和值组成的对(记录时长,视频宽度,高度等信息).
Video Tag Data
- 第1个字节包含视频数据的参数信息,标识了帧类型
(4 bit)
,编码ID(4 bit)
;- 第2个字节开始为视频流数据
(8*n bit)
.Audio Tag Data
- 第1个字节包含了音频数据的参数信息,标识了音频格式
(4 bit)
,采样率(2 bit)
,采样精度(1 bit)
,音频声道(1 bit)
;- 第2个字节开始为音频流数据
(8*n bit)
.