如何从c++文件中读取ADTS头文件

How to read ADTS header from file in C++?

本文关键字:文件 读取 ADTS c++      更新时间:2023-10-16

如何读取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。

第一个header的Hexdump:

0x000000: ff f9 50 40 01 3f fc

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

位掩码看起来不像它们匹配/*bit 30-42*/注释。

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

我的计算方法:

unsigned int AAC_frame_len = ((AAC_44100_buf [3], 0 x03) & lt; & lt; 11 | (AAC_44100_buf [4], 0 xff) & lt; & lt; 3 | (AAC_44100_buf [5], 0 xe0)>> 5);