MediaRecorder无需挑衅即可更改大小

Bra*_*rad 5 javascript firefox canvas webrtc mediarecorder-api

我正在使用MediaRecorder API和Canvas captureStream方法在浏览器中对画布的VP8视频流进行编码.此数据通过二进制Web套接字发送到FFmpeg.

var outputCaptureStream = $('canvas')[0].captureStream(30);
var mediaRecoder = new MediaRecoder(outputCaptureStream, {
  mimeType: 'video/webm'
});

mediaRecorder.ondataavailable = function (e) {
  ffmpegStdin.write(e.data);
}

mediaRecoder.start(1000);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,流似乎随机切换到较低分辨率的中间流.FFmpeg对此不满意:

输入流#0:0帧从大小更改:1280x720 fmt:yuv420p到大小:1024x576 fmt:yuv420p

[vp8 @ 0x2a02c00]未实现升级.将您的FFmpeg版本更新为Git中的最新版本.如果问题仍然存在,则表示您的文件具有尚未实现的功能.[vp8 @ 0x2a02c00]如果您想提供帮助,请将此文件的样本上传到ftp://upload.ffmpeg.org/incoming/并联系ffmpeg-devel邮件列表.(ffmpeg-devel@ffmpeg.org)

我怀疑它与CPU使用率过高有关,并且Firefox试图通过缩小视频来提供帮助.我的问题:

  • Firefox是否会动态缩小视频?
  • 如果是这样,有什么条件导致这种情况发生?(CPU负载?流背压?)
  • 有可能阻止Firefox这样做吗?
  • 对于我遗漏的这种行为有不同的解释吗?

小智 3

如果 Firefox 检测到系统的 CPU 过载,它将重新缩放(缩小)WebRTC/getUserMedia 视频。about:config 中有一些首选项可以控制此行为,但无法通过 JS 控制。

您可以通过设置禁用该功能

media.navigator.load_adapt=false

您可以查看其他 media.navigator.load_adapt.* 标志来对行为进行一些控制。默认情况下,如果 CPU 占用率超过 90% 持续 3 秒,您将获得降级。