使用 MediaDevices.getUserMedia() API 时,与 Chrome 相比,为什么 Safari 会生成巨大的视频?

dav*_*lyi 3 javascript safari video-capture html5-video webrtc

我正在设置一个小实验来测量MediaDevices.getUserMedia()API 捕获的视频的大小。

当我在 Safari 中运行代码时,它生成的视频比在 Chrome 中大 5-10 倍。这是我的代码:

index.html:

<html lang="en">
  <head>
    <title>Video Spike</title>
  </head>
  <body>
    <video autoplay id="video" muted></video>
    <br />
    <button id="record">Record 10 second video</button>
  </body>
  <script src="./index.js"></script>
</html>

Run Code Online (Sandbox Code Playgroud)

index.js:

const videoElem = document.getElementById("video");
const recordBtn = document.getElementById("record");

async function startCamera() {
  const stream = await navigator.mediaDevices.getUserMedia({
    audio: true,
    video: {
      frameRate: 30,
      height: 240,
      width: 240,
    },
  });

  videoElem.srcObject = stream;

  let buffer;

  recordBtn.addEventListener("click", () => {
    buffer = [];
    const recorder = new MediaRecorder(stream);

    setTimeout(() => recorder.stop(), 10000);

    recorder.ondataavailable = async (event) => {
      buffer.push(event.data);
      console.log(
        "current video size:",
        new Blob(buffer, { type: "video/webm" }).size / 1024 / 1024,
        "MB"
      );
    };

    recorder.start(1000);
  });
}

startCamera();

Run Code Online (Sandbox Code Playgroud)

10 秒后,Safari 记录了 6.5MB,Chrome 记录了 0.6MB。

我尝试使用 MediaContraints 对象、分辨率和记录的持续时间,但两个浏览器之间似乎总是存在巨大的尺寸差异。

chr*_*din 5

有一个选项可以bitsPerSecond在创建MediaRecorder.

new MediaRecorder(stream, { bitsPerSecond: 200_000 });
Run Code Online (Sandbox Code Playgroud)

看来 Chrome 和 Safari 有不同的默认值。

还可以单独设置audioBitsPerSecondvideoBitsPerSecond

  • 下划线称为“数字分隔符”。它的目的是使数字文字更具可读性。任何现代 JavaScript 运行时都应该支持它。 (3认同)