Является ли ведущая структура в файле MP3 реальным фреймом?

#audio #mp3 #codec #file-format #mpeg

#Аудио #mp3 #кодек #формат файла #mpeg

Вопрос:

Сейчас я выполняю некоторую работу по декодированию файлов MP3, но у меня есть лишь некоторые базовые знания о файле MP3. В наши дни я внедряю простой декодер для MP3. При сравнении декодированного результата с результатом декодера Maaate я сталкиваюсь с этой проблемой.

Мой декодер извлекает на один кадр больше, чем декодер Maaate. После тщательного изучения результата выборки файла MP3 я нахожу, что первый кадр является ненормальным. Для моего примера файла первый фрейм имеет длину 413 байт с заголовком frame 0xfffb9064 , отличным от всех других фреймов с длиной и заголовком 100 байт 0xfffb1064 .

Мой вопрос: является ли первый «кадр» в результате реальным кадром? Итак, почему он кажется отличным от других? Если нет, то для чего используется эта структура и как отличить ее от других, поскольку они оба совместно используют код синхронизации фреймов 0xfff ?

Ответ №1:

Потоки MP3 не имеют заголовка файла. Звучит немного странно, что у вас есть только один кадр в начале, который длиннее остальных, но это совершенно законно.

Краткое описание битов в заголовке по адресу:http://www.datavoyage.com/mpgscript/mpeghdr.htm

В вашем случае оба типа заголовка имеют общее значение:

  • MPEG-1
  • Уровень 3
  • Не защищено
  • 44,1 кГц
  • Нет заполнения
  • Не является частной
  • M / S joint stereo
  • Нет авторских прав
  • Оригинальный носитель
  • Без выделения

Первый кадр отличается от остальных:

  • 128 кбит (в результате получается 417 байтовых кадров минус 4 байтовый заголовок)

Остальные:

  • 32 кбит (в результате получается 104 байтовых кадра минус 4 байтовых заголовка)

На этой странице есть формула для расчета размера кадра на основе заголовка: 144 * битрейт / частота дискретизации отступ.

Я подозреваю, что 128-битный первый кадр является артефактом (ошибкой) кодировщика, используемого для генерации сэмпла. Это все еще файл с постоянным битрейтом в 32 кбит после первого кадра. Учитывая, что MP3-декодер не может выдавать выходные данные, пока в нем не будет нескольких кадров, и он не достигнет резкого скачка битрейта на полпути, это вряд ли что-то нарушит.

Комментарии:

1. Это неправильная формула. Правильная формула такова: frame_samplerate / 8 * битрейт/ сэмплирование заполнение

Ответ №2:

Самый первый фрейм может использоваться как то, что часто называют «хромым тегом» (название генератора не обязательно должно быть ХРОМЫМ).

Существовал (и все еще может существовать) способ создать этот тег в ffmpeg, когда кодировщик еще не знает, какими будут будущие данные, и поэтому ffmpeg просто использовал бы некоторые значения по умолчанию, такие как 128 кбит / с, вместо скорости, определенной в ваших данных MP3.

Итак, независимо от того, есть ли у вас CBR или VBR, данные не могут быть основаны на этом фрейме.

Чтобы увидеть, есть ли у вас такой тег, распечатайте по крайней мере первые 64 байта (или воспользуйтесь шестнадцатеричным редактором), и вы должны увидеть буквы «Info» (CBR) или «Xing» (VBR) довольно близко к началу (часто около байта 0x24). eyeD3 и ffprobe способны декодировать этот тег.

Здесь у меня есть страница о формате.

Ответ №3:

Вполне может быть, что первый фрейм является фреймом VBR. проверьте здесь и используйте шестнадцатеричный редактор. Надеюсь, это поможет

Комментарии:

1. Почему это было отклонено? Из того, что я вижу, вполне законная причина аномального первого кадра.