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 但可以计算出编解码器的其余部分,4d401e 有什么作用上面的意思是什么?

干杯托比

4

3 回答 3

125

codecs参数由RFC 6381指定。具体的含义和值请参见3.3 节。avc1mp4a

在 的情况下avc1.4D401E,表示 H.264 视频,后面是一个点和三个H.264 标准avc1定义的 2 位十六进制数字:

  1. profile_idc
  2. constraint_set包含标志的字节(当前constraint_set0_flag通过constraint_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 文件中序列参数集和 AVC 配置框的第二、第三和第四个字节。您可以使用诸如mp4file:之类的程序转储这些字节mp4file --dump movie.mp4。查找(AVC 配置)框和、和avcC的十六进制值。AVCProfileIndicationprofile_compatibilityAVCLevelIndication

至于mp4a.40.2mp4a表示 MPEG-4 音频。它后面是一个点和一个十六进制ObjectTypeIndicationobjectTypeId在输出中),可以在 MPEG4 注册站点mp4file上查找。如果此十六进制值为(ISO/IEC 14496-3 Audio),则后面跟着另一个点和十进制的音频对象类型。这些列在 ISO/IEC 14496-3 标准和Wikipedia中,对应于( ) 的前 5 位(除非这些位等于 31,在这种情况下,将 32 添加到接下来的 6 位)。 表示 AAC LC 音频,通常用于 H.264 HTML5 视频。40DecoderSpecificInfodecSpecificInfomp4a.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 回答
19

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

你可以使用这个命令:

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

于 2018-02-26T14:44:12.350 回答
15

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

于 2014-03-07T18:18:25.547 回答