html5-video - 如何(或可能)将 AVC 编解码器配置文件和级别转换为 MIME 编解码器定义?
问题描述
在我的用例中,我必须在 HTML5video
source
的 MIME 类型中提供编解码器规范。但是type="video/mp4; codecs=avc1"
对于 Firefox,即使是 a 也不够详细。Firefox 需要额外的例如type="video/mp4; codecs=avc1.64001E"
. 我的问题是我不知道64001E
从哪里得到这部分。
整个识别发生在服务器端。到目前为止,我一直在使用ffprobe
它,这完美地为我提供了 JSON 格式的输出,如下所示:
ffprobe -select_streams v:0 -v info -of json -show_entries stream=codec_name,level,profile,width,height -i 1CE89B23-F9BD-43B9-805B-C49ACA9E5FFB_xxxxxxx.mp4
"streams": [
{
"codec_name": "h264",
"profile": "High",
"width": 1080,
"height": 1920,
"level": 50
}
]
}
我可以得到配置文件和级别,但没有像64001E
. 在我的本地环境中,我也有mediainfo
:
mediainfo 8038B652-106B-4FBB-BAD6-AF7E32913FDE_xxxxxxx.mp4
General
Complete name : 8038B652-106B-4FBB-BAD6-AF7E32913FDE_xxxxxxx.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/avc1/mp41)
File size : 1.18 MiB
Duration : 6 s 634 ms
Overall bit rate : 1 496 kb/s
Writing application : Lavf57.83.100
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : High@L3
Format settings : CABAC / 5 Ref Frames
Format settings, CABAC : Yes
Format settings, Reference frames : 5 frames
Codec ID : avc1
Codec ID/Info : Advanced Video Coding
Duration : 6 s 634 ms
Bit rate : 1 396 kb/s
Width : 360 pixels
Height : 480 pixels
Display aspect ratio : 0.750
Frame rate mode : Constant
Frame rate : 30.000 FPS
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Scan type : Progressive
Bits/(Pixel*Frame) : 0.269
Stream size : 1.10 MiB (93%)
Writing library : x264 core 152 r2854 e9a5903
Encoding settings : cabac=1 / ref=5 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=8 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=2 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=15 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=3 / weightb=1 / open_gop=0 / weightp=2 / keyint=250 / keyint_min=25 / scenecut=40 / intra_refresh=0 / rc_lookahead=50 / rc=crf / mbtree=1 / crf=17.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / ip_ratio=1.40 / aq=1:1.00
Codec configuration box : avcC
Audio
ID : 2
Format : AAC LC
Format/Info : Advanced Audio Codec Low Complexity
Codec ID : mp4a-40-2
Duration : 6 s 632 ms
Duration_LastFrame : -9 ms
Bit rate mode : Constant
Bit rate : 90.4 kb/s
Channel(s) : 1 channel
Channel layout : C
Sampling rate : 44.1 kHz
Frame rate : 43.066 FPS (1024 SPF)
Compression mode : Lossy
Stream size : 73.2 KiB (6%)
Default : Yes
Alternate group : 1
我们在这里看到的是,AAC 部分的 Codec ID 更长mp4a-40-2
,但视频流仍然只是avc1
.
我正在查看列表https://tools.woolyss.com/html5-canplaytype-tester/和https://wiki.whatwg.org/wiki/Video_type_parameters我认为也许有一种编程方式来转换编解码器配置文件 + MIME 类型编解码器规范所具有的代码级别。
在https://developer.mozilla.org/en-US/docs/Web/Media/Formats/codecs_parameter我看到这"avc1.4d002a"
意味着Main Profile, Level 4.2
. 查看我之前链接的列表,我发现 6 个十六进制数字可以分成两组。最后两个是级别。在这个最新的例子中,Level 是4.2
,我们只需要删除点 => 它变成42
,它是2a
十六进制的。其他 4 个十六进制数字与配置文件相关,如 Main、High 等,然后是 Progressive,但我还没有找到定义,我想知道是否ffprobe
能够输出诸如High 4:2:2 Intra Level
or之类的东西High Progressive Level
。我们拭目以待。
https://www.rfc-editor.org/rfc/rfc6381#page-12有一些例子,但我点击了链接,仍然没有看到任何明确的列表或任何东西。
ITU-T H.264 规范附件 A 列出了 14 个配置文件。在那些列表profile_idc
中提到了一个,这似乎是前两个十六进制数字的小数,例如High
'sprofile_idc
是十进制的 100,即 64 hexa。现在我们只需要找出中间的两个十六进制数字。最好是 GitHub 存储库源文件,其中这些东西被整理成一个理智的简洁 const 文字数组。
解决方案
它在例如Mozilla 链接中进行了描述(“PPCCLL 是六个十六进制数字,指定配置文件号 (PP)、约束集标志 (CC) 和级别 (LL)”)。如果您没有找到适合您需求的工具,我们可以为此扩展 MediaInfo,让我们知道。
注意:列表中的 CC 是预期的标志,而不是文件中真正的标志,99.99% 的情况下应该没问题,但你不能确定它是真实的内容。MediaInfo 在内部读取标志,但暂时不导出它们。
推荐阅读
- java - 具有多个子类的休眠映射并从最小子类获取超级父数据
- python - 如何通过 path() 函数在 url 中传递可选参数?
- python - Keras:添加类权重后损失巨大
- paramiko - [asyncssh]:使用 python asyncssh 反向 ssh 隧道
- bash - bash 子序列匹配加速
- javascript - 从锚标签href属性更改自定义词
- python - 如何使用 Python 遍历目录中的文件并在给定特定约束的情况下输出 pandas 数据框?
- rest - SpringBoot:连接已经关闭
- sql - Excel 数据透视表更新了缺失的列
- kubernetes - Kubernetes 将变量固定到 pod