如何在C ++中从文件中读取ADTS头?

时间:2014-06-14 12:08:02

标签: c++ bit-manipulation aac adts

如何读取ADTS编码的aac文件的标头?我需要它来获取每帧的缓冲区长度以读出整个aac文件。但我无法获得正确的价值观。这是我的代码,当我假设大端时,读取标题并获取每个帧的缓冲区长度(位30-43):

main(){
  ifstream file("audio_adts.m4a", ios::binary);
  char header[7],buf[1024];
  int framesize;

  while(file.read(header,7)) {
      memset(buf ,0 , 1024);

      /* Get header bit 30 - 42 */
      framesize = (header[3]&240|header[4]|header[5]&1);

      cout << "Framesize including header: "<<framesize<<endl;
      file.read(buf,framesize);

      /*Do something with buffer*/
  }

  return 0;
}

我使用此代码获得的帧大小为65,45,45,45,-17然后由于负值而停止。实际的帧大小约为200。

第一个标题的Hexdump:

0x000000: ff f9 50 40 01 3f fc

2 个答案:

答案 0 :(得分:1)

您对framesize的提取似乎缺少<<,需要将提取的位移到正确的位置

位掩码看起来与/*bit 30-42*/评论不匹配。

另外,将char更改为unsigned char,因为当您进行此类位操作时(这是导致负值错误的原因),您将遇到所有类型的符号扩展问题

答案 1 :(得分:0)

我的计算方式:

unsigned int AAC_frame_len =(((AAC_44100_buf [3]&0x03)<< 11 |(AAC_44100_buf [4]&0xFF)<< 3 |(AAC_44100_buf [5]&0xE0)>> 5);