Как прочитать заголовок ADTS из файла в C++?

Как я могу прочитать заголовок файла ADAC, закодированного ADTS? Мне нужно, чтобы получить длину буфера для каждого кадра, чтобы прочитать весь файл 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

1 ответ

Ваша добыча framesize кажется, есть сдвиги << отсутствует, необходимо, чтобы извлечь бит в правильные места

Битовые маски не выглядят так, как будто они соответствуют /*bit 30-42*/ комментарий.

Кроме того, измените char в unsigned char в противном случае вы столкнетесь со всеми видами проблем с расширением знака при выполнении этого типа битовых манипуляций (что является причиной ошибки отрицательного значения)

Как я рассчитал это:

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

Другие вопросы по тегам