mp4 atom - Как различить аудиокодек?Это AAC или MP3? - PullRequest
12 голосов
/ 21 октября 2010

Я работаю над анализатором контейнеров 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

Спасибо FE

ОБНОВЛЕНИЕ:

Я нашел способ решить проблему: просмотрев кодAtomicParsley Я вижу, что можно получить информацию кодека об атоме потока (mp4a), читая 11-й байт в атом esds (элементарное описание потока).

Теперь я работаю следующим образом:

если значение 11-го байта равно 0x40, я предполагаю, что поток является AAC, в противном случае, если я читаю 0x69, я предполагаю, что поток является MP3.

Мне не нравятся эти "эмпирические" решения, поэтомуЯ ищу более правильный путь, но я нашел только Understanding_AAC , который не complete.

Кто-нибудь знает, где можно получить более подробную спецификацию контейнеров MP4?

Ответы [ 2 ]

29 голосов
/ 10 января 2011

В атоме 'esds' есть несколько полей, относящихся к определению кодека. Первый байт содержимого атома esds - objectTypeIndication (это 11-й байт от вашего решения). Это поле должно указывать используемый кодек, но есть несколько записей, используемых несколькими кодеками. MP4RA имеет полный список значений кодеков . Вот несколько, которые имеют отношение к этому делу:

  • 0x40 - MPEG-4 Audio
  • 0x6B - Аудио MPEG-1 (MPEG-1 Layers 1, 2 и 3)
  • 0x69 - MPEG-2 обратно совместимое аудио (MPEG-2 Layers 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 обычно рассматривается как AAC, но есть целая структура аудиокодеков, которые могут использоваться в аудио MPEG-4, включая AAC, BSAC, ALS, CELP и нечто, называемое MP3On4. MP3On4 - это вариант MP3 с некоторой новой информацией заголовка для многоканального.

Мы можем выяснить, какой аудиоформат на самом деле присутствует в MPEG-4 Audio, взглянув на AudioSpecificConfig. Это глобальный заголовок для декодера, который существует в байте 13 содержимого атома «esds». В начале AudioSpecificConfig есть 5-битный AudioObjectType. Полный список можно найти в мультимедийной вики (которая была указана в вашем посте в статье «Аудио MPEG-4»: 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, просто используйте objectTypeIndication.

В спецификациях MPEG эти данные распределены по 14496-1, -12, -14 и -3. Из них только 14496-12 находятся в свободном доступе: http://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

1 голос
/ 21 февраля 2019

Формат атома esds [1] определяется как:

Size 32-bit
Type 32-bit 'esds'
Version: 8-bit, zero.
Flags: 24-bit field, zero.
Elementary Stream Descriptor

Элементарный дескриптор потока определен в соответствующих документах MPEG4 [2].

Глядя на типичный ESDS из файла MP4A:

00000033 65736473 00000000 03808080  
22000100 04808080 14401500 00000001
FC170001 FC170580 80800212 08068080
800102

Понимать как

00000033 65736473 = ISO Atom "esds" of length 0x33
00000000 = Version/Flags field (0), meaning tagged Elementary Stream Descriptor follows
03808080 = TAG(3) = Object Descriptor ([2])
22       = length of this OD (which includes the next 2 tags)
  0001   = ES_ID = 1
      00 = flags etc = 0
04808080 = TAG(4) = ES Descriptor ([2]) embedded in above OD
14       = length of this ESD
  40     = MPEG4 Audio (see table for valid types here)
    15   = stream type(6bits)=5 audio, flags(2bits)=1
000000   = 24bit buffer size
0001FC17 = max bitrate (130,071 bps)
0001FC17 = avg bitrate
05808080 = TAG(5) = ASC ([2],[3]) embedded in above OD
02       = length
1208     = ASC (AOT=2 AAC-LC, freq=4 => 44100 Hz, chan=1 => single channel, flen0 => 1024 samples)
06808080 = TAG(6)
01       = length
02       = data

Refs:

...