html5视频标签编解码器属性

use*_*694 39 video 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>
Run Code Online (Sandbox Code Playgroud)

但是找不到正确的编解码器声明来播放视频,我已经下载了一个视频分析仪并且可以看到它的avc1并且可以看到音频map.40.2但是可以解决其余的编解码器,4d401e是什么在上面的意思?

干杯托比

mar*_*k4o 92

codecs参数由RFC 6381指定.具体而言,请参阅第3.3节了解avc1mp4a值的含义.

在这种情况下avc1.4D401E,avc1表示H.264视频,然后是一个点和由H.264标准定义的三个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主配置文件级别3
  • avc1.64001E:H.264 High Profile Level 3

这些也是MP4文件中序列参数集和AVC配置框的第二,第三和第四个字节.你可以转储使用程序,如这些字节mp4file:mp4file --dump movie.mp4.认准avcC(AVC配置)箱,为十六进制值AVCProfileIndication,profile_compatibilityAVCLevelIndication.

至于mp4a.40.2,mp4a表示MPEG-4的音频.接下来是一个点和一个十六进制ObjectTypeIndication(objectTypeIdmp4file输出中),可以在MPEG4注册站点上查找.如果此十六进制值为40(ISO/IEC 14496-3音频),则后跟另一个点和十进制的音频对象类型.这些列在ISO/IEC 14496-3标准和维基百科上,并且对应于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)
...
Run Code Online (Sandbox Code Playgroud)

  • 惊人的答案。我花了几个小时寻找这些信息。谢谢! (2认同)

小智 14

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   
Run Code Online (Sandbox Code Playgroud)

尽管具有不同的decSpecificInfo值,它们是相同的对象类型.


Cen*_*lti 12

您可以使用MP4Box工具找出RFC6381格式的编解码器字符串.你仍然需要用逗号加入他们.

您可以使用此命令:

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

  • 在Debian/Ubuntu中,安装此工具的包称为"gpac". (2认同)
  • `$brew install mp4box` 为我安装了 gpac,所以你们都是对的:) (2认同)