52

を使用して、ビデオ タグで特定のビデオ/オーディオ コーデックを指定しようとしています。

<video poster="movie.jpg" controls>
    <source src="movie.mp4" type='video/mp4; codecs="avc1.4D401E, mp4a.40.2"'/>
    <p>This is fallback content</p>
</video>

しかし、ビデオを再生するための適切なコーデック ステートメントが見つかりません。ビデオ アナライザーをダウンロードしたところ、それが avc1 であることがわかり、オーディオ map.40.2 であることがわかりますが、コーデックの残りの部分は解決できます。上記の意味?

乾杯トビー

4

3 に答える 3

125

codecsパラメータはRFC 6381で指定されています。特に、との値の意味については、セクション 3.3を参照してください。avc1mp4a

の場合avc1.4D401E、は H.264 ビデオを示し、その後にドットと、H.264 規格avc1で定義された 3 つの 2 桁の 16 進数が続きます。

  1. profile_idc
  2. constraint_setフラグを含むバイト(現在は、およびconstraint_set0_flagを介して)constraint_set5_flagreserved_zero_2bits
  3. level_idc

いくつかの例:

  • avc1.42E01E: H.264 制約付きベースライン プロファイル レベル 3
  • avc1.4D401E:H.264メインプロファイルレベル3
  • avc1.64001E:H.264ハイプロファイルレベル3

これらは、MP4 ファイルの Sequence Parameter Set と AVC Configuration Box の 2 番目、3 番目、および 4 番目のバイトでもあります。次のようなプログラムを使用して、これらのバイトをダンプできmp4fileますmp4file --dump movie.mp4。(AVC 構成) ボックスと、、avcCおよび の 16 進値を探します。AVCProfileIndicationprofile_compatibilityAVCLevelIndication

mp4a.40.2mp4aMPEG-4オーディオを示します。その後にドットと 16 進数ObjectTypeIndication(出力)objectTypeIdが続き、MPEG4 登録サイトで調べることができます。この 16 進値が(ISO/IEC 14496-3 Audio) の場合、その後に別のドットと 10 進数のオーディオ オブジェクト タイプが続きます。これらは、ISO/IEC 14496-3 標準およびWikipediaにリストされており、 ( )の最初の 5 ビットに対応します(これらのビットが 31 に等しい場合を除き、次の 6 ビットに 32 を追加します)。 は、H.264 HTML5 ビデオで通常使用される AAC LC オーディオを示します。mp4file40DecoderSpecificInfodecSpecificInfomp4a.40.2

たとえば、codecs="avc1.42E01E, mp4a.40.2"次の映画の場合は正しいでしょう。

$ mp4file --dump movie.mp4
...
    type avcC (moov.trak.mdia.minf.stbl.stsd.avc1.avcC)  ◀━━ avc1
     configurationVersion = 1 (0x01)
     AVCProfileIndication = 66 (0x42)    ◀━━ 42
     profile_compatibility = 224 (0xe0)  ◀━━ E0
     AVCLevelIndication = 30 (0x1e)      ◀━━ 1E
...
    type esds (moov.trak.mdia.minf.stbl.stsd.mp4a.esds)  ◀━━ mp4a
     version = 0 (0x00)
     flags = 0 (0x000000)
     ESID = 2 (0x0002)
     streamDependenceFlag = 0 (0x0) <1 bits>
     URLFlag = 0 (0x0) <1 bits>
     OCRstreamFlag = 0 (0x0) <1 bits>
     streamPriority = 0 (0x00) <5 bits>
     decConfigDescr
      objectTypeId = 64 (0x40)           ◀━━ 40
      streamType = 5 (0x05) <6 bits>
      upStream = 0 (0x0) <1 bits>
      reserved = 1 (0x1) <1 bits>
      bufferSizeDB = 0 (0x000000) <24 bits>
      maxBitrate = 78267 (0x000131bb)
      avgBitrate = 78267 (0x000131bb)
      decSpecificInfo
       info = <2 bytes>  11 90  |..|     ◀━━ 2 (first 5 bits in decimal)
...
于 2013-05-03T18:37:05.860 に答える
15

mark4o は、コーデック情報を解読する方法について、私が見た中で群を抜いて最良の説明を提供します。優秀な。

もう少し詳しく説明する必要があるのは、decSpecificInfo 値から特定のオーディオ オブジェクト タイプを取り出す方法です。「mp4a.40」の部分を見つけるのは非常に明確ですが、「.2」セクションは少し難しい場合があります。

1 バイトの 16 進数値のシーケンスから始めます。mark4o の例では「11 90」、私の場合は「12 08」です。これらは両方とも合計 2 バイトです...さらに多くの値が存在する可能性がありますが、オブジェクト タイプを見つけるために重要なのは最初の 2 つだけです (通常は最初のバイトのみ)。個々のビットを探しているので、16 進数値の各桁を 2 進数に変換します。各 16 進数の数字には 4 つの 2 進数が必要です。2 進数の最初の 5 桁 (最初の 16 進数から 4 桁、次の 1 桁から 1 桁) を取り、その 2 進数値を 10 進数に変換します。手順は次のとおりです。

Example 1 (11 90):
Starting value:                     11                90
Separate the hex digits:         1      1          9      0
Convert each digit to binary:   0001   0001       1001   0000
Take the first 5 bits:          0001   0
Combine into binary value:      00010
Convert to decimal:             2


Example 2 (12 08):
Starting value:                     12                08
Separate the hex digits:         1      2          0      8
Convert each digit to binary:   0001   0010       0000   1000
Take the first 5 bits:          0001   0
Combine into binary value:      00010
Convert to decimal:             2   

decSpecificInfo の値が異なっていても、これらは同じオブジェクト タイプです。

于 2014-03-07T18:18:25.547 に答える