1

MediaRecorder.isTypeSupported()返回true'​​video/webm'、'video/webm;codecs=avc1' 和 'video/webm;codecs=vp9'。

但是,只有 mimeType='video/webm;codecs=vp9' 会产生有效的 webm 文件 ('video/webm;codecs=vp9,opus')。

将 mimeType 设置为 'video/webm' 和 'video/webm;codecs=avc1' 会导致 'video/x-matroska;codecs=avc1,opus' 文件不是有效的 webm 视频。

这是 MediaRecorder 错误、Chrome 错误还是我遗漏了什么?\

软件:Chrome 85、MacOS 10.15。我没有在 Windows 或 Linux 上尝试过。

4

2 回答 2

1

再生产:

const wantMimeType = 'video/webm;codecs=h264,opus';
if (MediaRecorder.isTypeSupported(wantMimeType)) {
  let mediaRecorder = new MediaRecorder(stream, {
    mimeType: wantMimeType,
  });
  // ...drive the recorder
  mediaRecorder.onstop = (event) => {
    try {
      // returns 'video/x-matroska;codecs=avc1,opus' in Chrome,
      // and the binary file content also says Matroska instead of WebM
      let mimetype = mediaRecorder.mimeType;
      if (!mimeType.startsWith('video/webm')) {
        throw new Error(`We requested "${wantMimeType},
          but the browser gave us "${mediaRecorder.mimeType}"`);
      }
      let blob = new Blob(chunks, { type: mimeType });
      // ...convert to data: URL
      // ...play it in <video src="data:..."> // won't work, if Matroska
    } catch (ex) {
      alert(ex);
    }
  };
}

观察:

  1. Chrome 响应trueisTypeSupported('video/webm;codecs=h264,opus')但 Chrome 实际上不支持这种组合,即响应实际上是不正确的,并且违背了isTypeSupported().

  2. Chrome 会忽略我们在构造函数中传递的 mimetype,MediaRecorder而是返回video/x-matroska;codecs=avc1,opus. 然后它不起作用,因为<video>不会播放 Matroska mimetype。

2个解决方案:

  • Hacky:录制后,只需将 mimetype 改回video/webm;codecs=h264,opus. 文件内容仍会显示“Matroska”,但<video>在 Chrome 上会播放。这是一个糟糕的解决方案,因为我们传入了错误的 mimetype,它与内容不匹配。其他软件 - 或更高版本的 Chrome - 可能会破坏它。
  • 正确:不要使用 H.264,而是使用 VP9 或 VP8。Chrome 两者都支持,Firefox 支持 VP8,而且它们都能正常工作。作为奖励,它们是开放的,而 H.264 充满了软件专利。根据硬件编码器的实现,VP8/9 也可以提供更好的图像质量结果。
于 2021-03-23T17:26:57.970 回答
0

However, only mimeType='video/webm;codecs=vp9' results in a valid webm file.
Is this a MediaRecorder bug, Chrome bug or am I missing something?

WebM是 VP8 和 VP9 视频编解码器的正确 a/v 媒体容器。

AVC1视频编解码器属于 MPEG 容器 ( .mp4, .m4v)。
此视频编解码器也可以包含在 MKV 媒体文件 (Matroska .mkv) 中。

于 2020-10-06T23:21:27.150 回答