与 Chrome 相比,为什么 Firefox 会生成更大的 WebM 视频文件?

Why does Firefox produce larger WebM video files compared with Chrome?

我和我的团队最近一直在努力寻找一个解释,为什么在我们的项目中使用 MediaRecorder API 时,Firefox 会生成比 Chrome 更大的 WebM/VP8 视频文件。

简而言之,我们通过captureStream方法从HTMLCanvas记录一个MediaStream。为了从我们的应用程序中隔离可能影响此的所有内容,我开发了一个小型专用测试应用程序,它记录 <canvas> 并生成 WebM 文件。我一直在使用相同的镜头、视频持续时间、编解码器、A/V 比特率和帧率进行测试。然而,与 Chrome 相比,Firefox 最终仍然创建了多达 4 倍大的文件。我也尝试使用不同的 MediaStream 源,例如网络摄像头,但结果相似。

这里有一个 fiddle 可以证明我在说什么: https://jsfiddle.net/nzwasv8k/1/ https://jsfiddle.net/f2upgs8j/3/。 您可以尝试在 FF 和 Chrome 上录制 10 秒或 20 秒长的视频,并注意文件大小之间的差异。 请注意,我在此演示中只使用了 4 个相对简单的 frames/images。 在实际使用中,例如在我们录制桌面视频流的应用中,我们达到了惊人的 9 倍差异。

我不是视频编解码大师,但我相信浏览器在实现某种技术时应该遵循相同的规范;因此,我想应该不会出现如此巨大的差异。考虑到我的知识有限,我无法断定这是错误还是完全符合预期。这就是为什么我要在这里解决这个问题,因为到目前为止,我对该主题的研究完全没有结果。如果有人能指出其背后的逻辑解释是什么,我将非常高兴。提前致谢!

因为他们不使用相同的设置...

webm 编码器比我们从 MediaRecorder 访问的编码器 a lot of other params

这些参数都可能对输出文件的大小有影响,由实现者来设置。


这是我从您的 updated fiddle [点击放大] 生成的视频的快照:

Chrome 1 Firefox 1
Chrome 2 Firefox 2

我希望你能理解质量的差异,它与 webp 的 0.15 和 0.8 质量参数之间的差异大致相同,大小也反映了这些变化。

const supportWebPExport = document.createElement('canvas').toDataURL('image/webp').indexOf('webp') > -1;
const mime = supportWebPExport ? 'image/webp' : 'image/jpeg';

const img = new Image();
img.onload = doit;
img.crossOrigin = 'anonymous';
img.src = "https://i.imgur.com/gwytj0N.jpg";

function doit() {
 const canvas = document.createElement('canvas');
 const ctx = canvas.getContext('2d');
 canvas.width = this.width,
 canvas.height = this.height;
 ctx.drawImage(this, 0,0);
 
 canvas.toBlob(b => appendToDoc(b, '0.15'), mime, 0.15);
 canvas.toBlob(b => appendToDoc(b, '0.8'),mime, 0.8);
}

function appendToDoc(blob, qual) {
  const p = document.createElement('p');
  p.textContent = `quality: ${qual} size: ${blob.size/1000}kb`;
  p.appendChild(new Image).src = URL.createObjectURL(blob);
  document.body.appendChild(p);
}

所以是的,事情就是这样......一种或另一种方式可能更适合您的情况,但最好的办法是我们网络开发人员可以访问这些参数。不幸的是,this is not an easy thing to do from the specs point-of-view...