AAC音频码流分析
基础知识
- ADTS:Audio Data Transport Stream是AAC的一种十分常见的传输格式。
- AAC原始码流(又称为“裸流”)是由一个一个的ADTS frame组成的。
ES流(Elementary Stream): 基本码流,编码器出来的流。他们的结构如下图所示。
其中每个ADTS frame之间通过syncword(同步字)进行分隔。同步字为0xFFF(二进制“111111111111”)。
- AAC码流解析的步骤就是首先从码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
这个同步字其实是在头信息里面,这个头信息:ADTS 头中相对有用的信息 采样率、声道数、帧长度,等于是一个类一样,告诉你这个码流里面的相对信息是什么。
以下代码是实现的部分: 分析码流中搜索0x0FFF,分离出ADTS frame;然后再分析ADTS frame的首部各个字段。
代码的开端:simplest_aac_parser("/home/huangyu/HYtest/aac/nocturne.aac");
//函数:获取到一个ADTSframe的数据 :
//其中参数为input_data = aacbuffer: 这个参数是读取了1024*1024-offset(ifile文件中的数据长度)的流--------- buffer
//data_size读取1byte有效的数据的次数----------------------------------------------------------------- buf_size
//aacframe是一个堆中的5KB的数据空间------------------------------------------------------------------ data
//size的地址值--------------------------------------------------------------------------------------定义一个长度
//这里传递过来的都是地址值 除了buf_siez.修改后外面的值都会改变
//9.1 进入到这个方法里面
int getADTSframe(unsigned char* buffer, int buf_size, unsigned char* data ,int* data_size){
int size = 0;
//9.2 等于是一个判空的操作
if(!buffer || !data || !data_size ){
return -1;
}
while(1){
//9.3 这里为什么要判断buf_size<7,因为一个ADTSframe的头信息 一般是7个Byte,如果7个都没有 说明信息是错误的,可以看上面的图
if(buf_size < 7 ){
return -1;
}
//Sync words
//9.4 这里buffer是读取了ifile流数据的
if((buffer[0] == 0xff) && ((buffer[1] & 0xf0) == 0xf0) ){
//9.4.1 进入到这里 说明前4个Byte 是 0xfffff0 & 运算 相同为1,不同为假。
// << :表达式14 << 2的值为56,因为14(即