背景
在保存aac格式的信息流时必须要对每一帧aac信息流加以头信息,否则解码器无法识别aac信息流,这个信息头就是ADTS信息头。
代码
int write_ADTS_header(AVPacket *pkt, AVCodecParameters& codecpar) {
int length = pkt->size + ADTS_HEADER_SIZE;
uint8_t *data1 = new uint8_t[length];
memcpy(data1 + ADTS_HEADER_SIZE, pkt->data, pkt->size);
uint8_t pb[ADTS_HEADER_SIZE] = { 0 };
int sample_index = 0x4;
int channel = codecpar.channels;
switch (codecpar.sample_rate)
{
case 48000:sample_index = 0x3;
break;
case 44100:sample_index = 0x4;
break;
case 32000:sample_index = 0x5;
break;
}
// # 编辑信息头
pb[0] = 0xff;
pb[1] = 0xf1;
pb[2] = 0x40 | (sample_index << 2) | (channel >> 2);
pb[3] = ((channel & 0x3) << 6) | (length >> 11);
pb[4] = (length >> 3) & 0xff;
pb[5] = ((length << 5) & 0xff) | 0x1f;
pb[6] = 0xfc;
// # end 编辑信息