Web 编解码器 API 中要使用的有效编解码器字符串是什么?

Nin*_*liu 10 javascript codec

我想确切地知道我可以传递哪些字符串codecVideoEncoder.isConfigSupported({ codec, width, height })但到目前为止我还没有找到明确的答案:

  • TS 声明文件仅明确它必须是一个字符串(我希望我能在那里找到字符串常量的并集 ^^)
  • 谷歌的这篇网络编解码器文章仅精确说明这vp8是一个有效的编解码器字符串
  • 规格是一个兔子洞,我很难导航
    • 它们描述了编解码器字符串应该做什么,但不包括广泛的列表
    • 他们明确规定编解码器字符串必须匹配av01.*avc1.*vp8vp09.*。从那里,有一些链接可以找到更多信息,但我找不到如何导航它们。例如,我想知道哪些编解码器以 开头av01.,因此我访问了其注册页面,该页面链接theretherethere。前两个链接没有说明完全限定的编解码器字符串,最后一个链接链接到我最初开始的网络编解码器规范:/
  • 这个关于 mime 类型编解码器的 MDN 页面非常完整,并解释了创建编解码器字符串的规则,但我尝试过的很多内容似乎都不起作用

由于目前只有基于 chromium 的浏览器支持此功能,因此我决定查找 chromium 源代码,并发现列出了更多编解码器字符串的位置:

  • webcodecs目录中的测试显然是通过JSTEST.run层触发的,而不是从那里触发的,在这个 python 文件中,上面提到了更多的编解码器字符串:avc1.42001E,,vp8vp09.00.10.08
  • 这里似乎提到了一些编解码器字符串以及其他内容:video, h264, vp8, hevc, vp9, audio, aac,opus
  • 该测试文件列出了一系列与canPlayType一起使用的编解码器(不是网络编解码器的一部分,但相关)

所有这一切都非常令人沮丧,因为我有一个很大的编解码器列表,有时可以传递给网络编解码器,但我不确定这是否是完整的列表。我还应该看哪里?

const maybeCodecs = ["aac","ac-3","audio","avc1","avc1, mp4a.40","avc1, mp4a.40.02","avc1, mp4a.40.2","avc1.42001E","avc1.42101E","avc1.42701E","avc1.42E01E","avc1.42E01E, mp4a.40","avc1.42E01E, mp4a.40.02","avc1.42E01E, mp4a.40.2","avc1.42F01E","avc3","avc3, mp4a.40","avc3, mp4a.40.02","avc3", "mp4a.40.2","avc3.42801E","avc3.42C01E","avc3.42E01E","avc3.42E01E, mp4a.40","avc3.42E01E, mp4a.40.05","avc3.42E01E, mp4a.40.29","avc3.42E01E, mp4a.40.5","ec-3","flac","h264","hev1.1.6.L93.B0","hev1.1.6.L93.B0,mp4a.40.5","hevc","hvc1.1.6.L93.B0","hvc1.1.6.L93.B0,mp4a.40.5","mp4a.40","mp4a.40.02","mp4a.40.2","mp4a.66","mp4a.67","mp4a.68","mp4a.69","mp4a.6B","mp4a.A5","mp4a.A6","mp4a.a5","mp4a.a6","opus","theora","video","vp09.00.10.08","vp8","vp9"];

(async () => {
  if (typeof VideoEncoder === "undefined") return console.log('web codecs is not supported');
  const supportedCodecs = [];
  const unsupportedCodecs = [];
  const codecsThatTriggerError = [];
  for (const codec of maybeCodecs) {
    try {
      const { supported } = await VideoEncoder.isConfigSupported({ codec, width: 256, height: 256 });
      if (supported) supportedCodecs.push(codec);
      else unsupportedCodecs.push(codec);
    } catch(e) {
      codecsThatTriggerError.push(codec);
    }
  }
  console.log({ supportedCodecs, unsupportedCodecs, codecsThatTriggerError });
})()
Run Code Online (Sandbox Code Playgroud)

小智 1

为了保持一致性,WebCodecs 编解码器注册表中描述的格式字符串被设计为与 ISOBMFF 中使用的字符串相匹配。根据编解码器的不同,字符串中可能包含相当数量的元数据,因此虽然列表是有限的,但它却非常大。

以AV1为例,ISOBMFF绑定指定的格式为

av01.<profile>.<level><tier>.<bitDepth>.<monochrome>.<chromaSubsampling>.
<colorPrimaries>.<transferCharacteristics>.<matrixCoefficients>.<videoFullRangeFlag>
Run Code Online (Sandbox Code Playgroud)

其中大多数字段都是可选的。

一般来说,如果一个编解码器字符串能够根据编解码器注册中的定义进行解析,则该编解码器字符串是有效的。