前面的操作 分析 flv 头 tag 头 和视频解析是一样的就不多诉。
因为 flv中音频数据是没有 adts头的 所以要在 第一个音频包 提取信息
然后自己构建一个adts头 添加到没帧aac数据之前
//在flv中第一帧
struct FLVAACADST{
unsigned char SamplIndex1:3;
unsigned char OBjecttype:5;//2
unsigned char other:3;//000
unsigned char channel:4;
unsigned char SamplIndex2:1;
};
int info=0;
int aactype=0;
Read8(info,flvfile);
Read8(aactype,flvfile);
if (aactype==0x00)
{
HasAudioSpecificConfig=true;
fread(&m_flvadst,1,sizeof(m_flvadst),flvfile);//常见的有0x1210 0x1390,有时候会有7个字节,只要前面两个就行
m_aacadst.check1=0xff;
m_aacadst.check2=0xff;
m_aacadst.check3=0xff;
m_aacadst.check4=0xff;
m_aacadst.protection=1;
m_aacadst.ObjectType=0;
m_aacadst.SamplingIndex=m_flvadst.SamplIndex2|m_flvadst.SamplIndex1<<1;
m_aacadst.channel2=m_flvadst.channel;
return;
}
adts头结构:
//aac封装 每个帧头结构
struct AACADST{
unsigned char check1;
unsigned char protection:1;//误码校验1
unsigned char layer:2;//哪个播放器被使用0x00
unsigned char ver:1;//版本 0 for MPEG-4, 1 for MPEG-2
unsigned char check2:4;
unsigned char channel1:1; 小端存储 先写 低位
unsigned char privatestream:1;//0
unsigned char SamplingIndex:4;//采样率
unsigned char ObjectType:2;
unsigned char length1:2;
unsigned char copyrightstart:1;//0
unsigned char copyrightstream:1;//0
unsigned char home:1;//0
unsigned char originality:1;//0
unsigned char channel2:2;
unsigned char length2;
unsigned char check3:5;
unsigned char length3:3;
unsigned char frames:2;//超过一块写
unsigned char check4:6;
};
根据datalength 设置 aac中data数据大小:
if (HasAudioSpecificConfig)
{
unsigned int size=datelength-2+7;
m_aacadst.length1=(size>>11)&0x03;
m_aacadst.length2=(size>>3)&0xff;
m_aacadst.length3=size&0x07;
fwrite((char*)&m_aacadst,1,sizeof(AACADST),aacfile);
}