与 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...
我和我的团队最近一直在努力寻找一个解释,为什么在我们的项目中使用 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
Chrome 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...