14

私はmp4コンテナパーサーに取り組んでいますが、ストリームのオーディオコーデックを認識しようと夢中になっています。QtAtomViewerとAtomicParsleyの両方を使用しましたが、アトムが見つかった場合:

trak-> mdia-> minf-> stbl-> stsd

mp4ファイルにmp3ストリームがある場合でも、常に「mp4a」が表示されます。

「.mp3」fourccを探す必要がありますか?

私は2つの異なるmp4構造を添付します:AACオーディオストリームを備えたmp4コンテナ

     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

mp3オーディオストリーム付きのmp4コンテナ

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しか見つかりませんでした。

MP4コンテナのより詳細な仕様をどこで入手できるか知っている人はいますか?

4

3 に答える 3

32

'esds'アトムには、コーデックの決定に関連するいくつかのフィールドがあります。esdsアトムのコンテンツの最初のバイトはobjectTypeIndication(ソリューションから11番目のバイトです)です。このフィールドは、使用されているコーデックを示すことになっていますが、複数のコーデックで使用されているエントリがいくつかあります。MP4RAには、コーデック値の完全なリストがあります。この場合に関連するものは次のとおりです。

  • 0x40-MPEG-4オーディオ
  • 0x6B-MPEG-1オーディオ(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、および30x67は、MPEG-2 AAC LCを示しますが、通常は使用されません0x0400x66また、0x68MPEG-2 AACプロファイルはさらに少ない頻度で表示されます)。0x40MPEG-4オーディオを示します。MPEG-4オーディオは一般的にAACと考えられていますが、AAC、BSAC、ALS、CELP、およびMP3On4と呼ばれるものを含むMPEG-4オーディオに使用できるオーディオコーデックのフレームワーク全体があります。MP3On4は、マルチチャネル用のいくつかの新しいヘッダー情報を備えたMP3バリアントです。

を見ると、MPEG-4オーディオで実際にどのオーディオ形式であるかを理解できますAudioSpecificConfig。これは、「esds」アトムのコンテンツのバイト13に存在するデコーダーのグローバルヘッダーです。の先頭にAudioSpecificConfigは5ビットがありますAudioObjectType。完全なリストはマルチメディアウィキにあります(これは「MPEG-4オーディオ」の記事の下であなたの投稿にリンクされていました:http ://wiki.multimedia.cx/index.php?title = MPEG-4_Audioですが、ここにあります有用な値:

  • 00-NULL
  • 01-AACメイン(MPEG-2から非推奨のAACプロファイル)
  • 02-AAC LCまたは下位互換性のあるHE-AAC(ほとんどの現実世界のAACはこれらのケースの1つに該当します)
  • 03-AACスケーラブルサンプルレート(めったに使用されません)
  • 03-AAC LTP(AAC Mainの代替品、めったに使用されない)
  • 05-HE-AACが明示的に通知されました(下位互換性がありません)
  • 22-ER BSAC(韓国の放送コーデック)
  • 23-低遅延AAC
  • 29-HE-AACv2が明示的に通知されました(1つのドラフトでは、これは代わりにMP3On4でした)
  • 31-エスケープ(さらに6ビットを読み取り、32を追加)
  • 32-MP3on4レイヤー1
  • 33-MP3on4レイヤー2
  • 34-MP3on4レイヤー3

'MP3On4' mp3バリアントやその他の奇妙なMPEG-4オーディオコーデックについて心配していない場合は、を使用してobjectTypeIndicationください。

MPEG仕様では、これらの詳細は14496-1、-12、-14、および-3に分散しています。これらのうち、14496-12のみが無料で入手できます:http ://standards.iso.org/ittf/PubliclyAvailableStandards/index.html

于 2011-01-10T05:54:43.327 に答える
6

esdsアトム[1]のフォーマットは次のように定義されます。

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

Elementary Stream Descriptorは、関連するMPEG4ドキュメント[2]で定義されています。

MP4Aファイルからの典型的なESDSを見てください:

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

参照:

于 2019-02-21T09:07:26.133 に答える
2

Andy Hensonからの回答のフィールド分割は間違っています。「0x80」バイトはタグの一部ではなく、長さの一部であり、Varint32の長さを形成します。

00000033 65736473 = ISO Atom "esds" of length 0x33
00000000 = Version/Flags field (0), meaning tagged Elementary Stream Descriptor follows
03       = TAG(3) = Object Descriptor ([2])
80808022 = length = 34 [4] of this OD (which includes the next 3 tags)
  0001   = ES_ID = 1
      00 = flags etc = 0
04       = TAG(4) = ES Descriptor ([2]) embedded in above OD
80808014 = 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
05       = TAG(5) = ASC ([2],[3]) embedded in above OD
80808002 = length
1208     = ASC (AOT=2 AAC-LC, freq=4 => 44100 Hz, chan=1 => single channel, flen0 => 1024 samples)
06       = TAG(6)
80808001 = length
02       = data

長さのコーディングは、MPEG-4システム(ISO 14496-1)、付録E.1に記載されています。

于 2020-04-11T14:48:31.860 に答える