【问题标题】:html5 video tag codecs attributehtml5 视频标签编解码器属性
【发布时间】:2013-04-28 02:36:00
【问题描述】:

我正在尝试使用

在视频标签中指定特定的视频/音频编解码器
<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是什么意思?

干杯 托比

【问题讨论】:

    标签: html video


    【解决方案1】:

    codecs 参数由RFC 6381 指定。具体看section 3.3avc1mp4a值的含义。

    对于avc1.4D401Eavc1表示H.264视频,后面跟着一个点和三个the H.264 standard定义的2位十六进制数:

    1. profile_idc
    2. 包含constraint_set 标志的字节(目前是constraint_set0_flagconstraint_set5_flag,以及reserved_zero_2bits
    3. level_idc

    一些例子:

    • avc1.42E01E:H.264 约束基线配置文件级别 3
    • avc1.4D401E: H.264 Main Profile Level 3
    • avc1.64001E: H.264 High Profile Level 3

    这些也是 MP4 文件中 Sequence Parameter Set 和 AVC Configuration Box 的第二、第三和第四个字节。您可以使用诸如mp4file:mp4file --dump movie.mp4 之类的程序转储这些字节。查找avcC(AVC 配置)框和AVCProfileIndicationprofile_compatibilityAVCLevelIndication 的十六进制值。

    mp4a.40.2mp4a 表示 MPEG-4 音频。它后面是一个点和一个十六进制的ObjectTypeIndicationobjectTypeIdmp4file 输出中),可以在the MPEG4 registration site 上查找。如果此十六进制值为40(ISO/IEC 14496-3 音频),则后面跟着另一个点和十进制的音频对象类型。这些在 ISO/IEC 14496-3 标准和Wikipedia 中列出,对应于DecoderSpecificInfo (decSpecificInfo) 的前 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)
    ...
    

    【讨论】:

    • 感谢您的信息 - 非常有帮助
    • 惊人的答案。我花了几个小时寻找这些信息。谢谢!
    【解决方案2】:

    您可以使用MP4Box 工具查找RFC6381 格式的编解码器字符串。你仍然必须用逗号加入它们。

    你可以使用这个命令:

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

    【讨论】:

    • 在 Debian / Ubuntu 中,安装此工具的软件包称为“gpac”。
    • 这是使用 OSX/homebrew 为我工作的解决方案。
    • $ brew install mp4box 为我安装 gpac,所以你们都是对的 :)
    【解决方案3】:

    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 值不同,但它们是相同的对象类型。

    【讨论】:

      猜你喜欢
      • 2018-10-15
      • 2011-04-10
      • 2017-11-20
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 2012-08-01
      • 2011-07-11
      相关资源
      最近更新 更多