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

标签 google-chrome firefox webm vp8 web-mediarecorder

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

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

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

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

最佳答案

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

webm 编码器有 a lot of other params比我们可以从 MediaRecorder 访问的那些。

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

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

Chrome 1
Firefox 1
Chrome 2
Firefox 2

我希望你能体会到质量的差异,它和 webp 的 0.15 和 0.8 的质量参数差不多,大小也反射(reflect)了这些变化。

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...

关于google-chrome - 与 Chrome 相比,为什么 Firefox 生成的 WebM 视频文件更大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54651869/

相关文章:

javascript - chrome浏览器如何调用父窗口函数?

google-chrome - Selenium 中 ChromeDriver 的随机 NoHttpResponseException

java - 启动Firefox并等待其关闭

ffmpeg - 如何将 WebM 文件透明地转换为 WebP 文件?

javascript - 无法在 recordRTC 中记录更高的帧速率

javascript - Firefox 的 textContent 与 Chrome 的 innerText 不匹配

html - Chrome 如何知道我的地理位置?

javascript - 更改 Firefox 输入文件标签中的光标样式

Firefox 和 UTF-16 编码

c++ - 如何在基于 ffmpeg 的程序中以编程方式传递 VP8 编码器选项