2

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

第一个标头的十六进制转储:

0x000000: ff f9 50 40 01 3f fc
4

2 回答 2

1

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

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

此外,更改charunsigned char,否则当您执行此类位操作时会遇到各种符号扩展问题(这是您的负值错误的原因)

于 2014-06-14T12:18:56.983 回答
0

我计算的方式:

无符号整数 AAC_frame_len = ((AAC_44100_buf[3]&0x03)<<11|(AAC_44100_buf[4]&0xFF)<<3|(AAC_44100_buf[5]&0xE0)>>5);

于 2019-01-17T10:49:59.977 回答