【问题标题】:How to read ADTS header from file in C++?如何从 C++ 文件中读取 ADTS 标头?
【发布时间】:2014-06-14 12:08:02
【问题描述】:

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

【问题讨论】:

  • 你怎么知道它不是正确的值?你期望的输入和输出是什么?
  • 查看我的编辑。框架的长度约为 200
  • 所以第一个标头得到 65,但预计大约 200。由于标头只有 7 个字节,您可以发布第一个标头的 hexdump 吗?
  • @user2212461 你的问题得到答案了吗?
  • 请注意main() 是错误的。默认整数很久以前就被禁止了

标签: c++ bit-manipulation aac adts


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    我的计算方式:

    无符号整数 AAC_frame_len = ((AAC_44100_buf[3]&0x03)>5);

    【讨论】:

      猜你喜欢
      • 2015-07-01
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多