2013-05-03 131 views
30

我試圖用HTML5視頻標籤編解碼器屬性

<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,但可以找出編解碼器的其餘部分,那麼4d401e在上面的含義是什麼?

乾杯 託比

回答

66

codecs參數由RFC 6381指定。具體而言,請參閱section 3.3以獲得avc1mp4a值的含義。

avc1.4D401E的情況下,指示avc1 H.264視頻,這是後面跟着一個點和三個2位十六進制數由the H.264 standard定義:

  1. profile_idc
  2. 字節含有constraint_set標誌(目前constraint_set0_flag通過constraint_set5_flagreserved_zero_2bits
  3. level_idc

一些例子:

  • avc1.42E01E:H.264約束Baseline Profile的3級
  • avc1.4D401E:標準H.264 Main Profile級別3
  • avc1.64001E:H.264 High Profile的3級

這些也是MP4文件中序列參數集和AVC配置框的第二,第三和第四個字節。您可以使用諸如mp4file的程序轉儲這些字節:mp4file --dump movie.mp4。請查找avcC(AVC配置)框以及AVCProfileIndication,profile_compatibilityAVCLevelIndication的十六進制值。

至於mp4a.40.2,mp4a表示MPEG-4音頻。接下來是一個點和一個十六進制ObjectTypeIndicationobjectTypeId,mp4file輸出),可以在the MPEG4 registration site上查找。如果這個十六進制值是40(ISO/IEC 14496-3音頻),則其後是另一個點和一個十進制音頻對象類型。這些在ISO/IEC 14496-3標準和Wikipedia中列出,並且對應於DecoderSpecificInfodecSpecificInfo)的前5位(除非這些位等於31,在這種情況下將32添加到接下來的6位)。 mp4a.40.2表示AAC LC音頻,這通常與H.264 HTML5視頻一起使用。

例如,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) 
... 
+1

感謝您的信息 - 非常有幫助 – user2302694 2013-05-06 20:24:49

+0

驚人的答案。我花了數小時尋找這些信息。謝謝! – nbz 2016-08-27 18:15:19

12

mark4o給出了到目前爲止,我已經看到了如何破譯編解碼器信息的最好說明。優秀。

可能需要更多細節的一件事是如何從decSpecificInfo值中分離出特定的音頻對象類型。找到「mp4a.40」部分非常清楚,「.2」部分可能有點棘手。

我們從單字節十六進制值序列開始:mark4o示例中的「11 90」或我的例子中的「12 08」。這兩個字節總共是2個字節......可能有更多的值,但只有前2個用於查找對象類型(通常只有第一個字節)的問題。我們正在尋找個別位,以便將十六進制值中的每個數字轉換爲二進制數;每個十六進制數字應該有4個二進制數字。取前5個二進制數字 - 第一個十六進制數字爲4,下一個數字爲1,並將該二進制值轉換爲十進制數。以下是步驟:

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值不同,它們仍是相同的對象類型。

0

您可以使用MP4Box工具來查找RFC6381格式的編解碼器字符串。你還得用逗號加入他們。

你可以使用這個命令:

MP4Box -info big.mp4 2>&1 | grep RFC6381 | awk '{print $4}' | paste -sd , -