Mp4 atom - Как распознать аудиокодек? Это AAC или MP3?
Я работаю над парсером mp4-контейнера, но я схожу с ума, пытаясь распознать аудиокодеки потоков.
Я использовал как QtAtomViewer, так и AtomicParsley, но когда я нахожу атом:
trak- > mdia- > minf- > stbl- > STSD
Я получаю всегда "mp4a", даже если файл mp4 имеет mp3-поток.
Должен ли я искать ".mp3" fourcc?
Я прикрепляю две разные структуры mp4:
Контейнер mp4 с аудиопотоком AAC
Atom trak @ 716882 of size: 2960, ends @ 719842
Atom tkhd @ 716890 of size: 92, ends @ 716982
Atom mdia @ 716982 of size: 2860, ends @ 719842
Atom mdhd @ 716990 of size: 32, ends @ 717022
Atom hdlr @ 717022 of size: 33, ends @ 717055
Atom minf @ 717055 of size: 2787, ends @ 719842
Atom dinf @ 717063 of size: 36, ends @ 717099
Atom dref @ 717071 of size: 28, ends @ 717099
Atom stbl @ 717099 of size: 2727, ends @ 719826
Atom stts @ 717107 of size: 24, ends @ 717131
Atom stsz @ 717131 of size: 1268, ends @ 718399
Atom stsc @ 718399 of size: 40, ends @ 718439
Atom stco @ 718439 of size: 32, ends @ 718471
Atom stss @ 718471 of size: 1264, ends @ 719735
Atom stsd @ 719735 of size: 91, ends @ 719826
Atom mp4a @ 719751 of size: 75, ends @ 719826
Atom esds @ 719787 of size: 39, ends @ 719826
Atom smhd @ 719826 of size: 16, ends @ 719842
mp4 контейнер с аудиопотоком mp3
Atom trak @ 1663835 of size: 4844, ends @ 1668679
Atom tkhd @ 1663843 of size: 92, ends @ 1663935
Atom mdia @ 1663935 of size: 4744, ends @ 1668679
Atom mdhd @ 1663943 of size: 32, ends @ 1663975
Atom hdlr @ 1663975 of size: 45, ends @ 1664020
Atom minf @ 1664020 of size: 4659, ends @ 1668679
Atom smhd @ 1664028 of size: 16, ends @ 1664044
Atom dinf @ 1664044 of size: 36, ends @ 1664080
Atom dref @ 1664052 of size: 28, ends @ 1664080
Atom stbl @ 1664080 of size: 4599, ends @ 1668679
Atom stsd @ 1664088 of size: 87, ends @ 1664175
Atom mp4a @ 1664104 of size: 71, ends @ 1664175
Atom esds @ 1664140 of size: 35, ends @ 1664175
Atom stts @ 1664175 of size: 24, ends @ 1664199
Atom stsc @ 1664199 of size: 28, ends @ 1664227
Atom stsz @ 1664227 of size: 2228, ends @ 1666455
Atom stco @ 1666455 of size: 2224, ends @ 1668679
Спасибо
ИП
UPDATE:
Я нашел способ решить проблему:
наблюдая за кодом AtomicParsley, я вижу, что можно получить
информация о кодеках о атоме потока (mp4a), чтение 11-го байта
в эсэдс (элементный описатель потока).
Теперь я работаю следующим образом:
если значение 11-го байта равно 0x40. Я предполагаю, что поток является AAC, иначе если я прочитаю 0x69, я предполагаю, что поток является MP3.
Мне не нравятся эти "эмпирические" решения, поэтому я ищу более правильные
путь, но я нашел только Understanding_AAC, который не является полным.
Кто-нибудь знает, где я могу получить более подробную спецификацию контейнеров MP4?
Ответы
Ответ 1
В атоме "esds" имеется несколько полей, относящихся к определению кодека. Первый байт содержимого атома esds - это objectTypeIndication
(это 11-й байт от вашего решения). Это поле должно указывать на используемый кодек, но есть несколько записей, используемых несколькими кодеками. MP4RA имеет полный список значений кодеков. Вот несколько примеров, которые имеют значение в этом случае:
- 0x40 - MPEG-4 Audio
- 0x6B - MPEG-1 Audio (слои MPEG-1 1, 2 и 3)
- 0x69 - MPEG-2 обратное совместимое аудио (слои MPEG-2 1, 2 и 3)
- 0x67 - MPEG-2 AAC LC
0x6B
и 0x69
обозначают MPEG-1 и 2 соответственно уровни 1, 2 и 3. 0x67
обозначает MPEG-2 AAC LC, но обычно не используется в пользу 0x040
(0x66
и 0x68
также видны еще MPEG-2 AAC-профили). 0x40
обозначает MPEG-4 Audio. MPEG-4 Audio обычно воспринимается как AAC, но существует целая структура аудиокодеков, которые могут работать в MPEG-4 Audio, включая AAC, BSAC, ALS, CELP и что-то вроде MP3On4. MP3On4 - это вариант MP3 с новой информацией заголовка для многоканального.
Мы можем понять, какой аудиоформат на самом деле находится в MPEG-4 Audio, посмотрев на AudioSpecificConfig
. Это глобальный заголовок для декодера, который существует в байте 13 содержимого атома "esds". В начале AudioSpecificConfig
имеется 5-бит AudioObjectType
. Полный список можно найти в мультимедийной вики (которая была связана в вашем сообщении в статье "MPEG-4 Audio": http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio, но вот полезные значения:
- 00 - NULL
- 01 - AAC Main (устаревший профиль AAC из MPEG-2)
- 02 - AAC LC или обратная совместимость HE-AAC (большинство AAC в реальном мире попадает в один из этих случаев)
- 03 - Скользящая частота выборки AAC (редко используется)
- 03 - AAC LTP (замена для AAC Main, редко используется)
- 05 - HE-AAC явно сигнализировал (без обратной совместимости)
- 22 - ER BSAC (корейский широковещательный кодек)
- 23 - Низкая задержка AAC
- 29 - HE-AACv2 явно сигнализировал (в одном проекте это был MP3On4)
- 31 - ESCAPE (читайте еще 6 бит, добавьте 32)
- 32 - MP3on4 Layer 1
- 33 - MP3on4 Layer 2
- 34 - MP3on4 Layer 3
Если вас не волнует формат MP3On4 или другие странные аудиокодеки MPEG-4 Audio, просто используйте objectTypeIndication
.
В спецификациях MPEG эти данные распространяются на 14496-1, -12, -14 и -3. Из них доступно только 14496-12: http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html