我正在尝试将通过 WebRTC 的 getUserMedia() 方法获得的视频流发送到服务器以进行额外处理。延迟很重要,因为我希望检测视频流中的变化并立即更新客户端。对于这种特殊用途,仅 Firefox 的解决方案是可以接受的,因此我正在研究 MediaRecorder界面。
我整理了一个简单的测试用例,包括在下面。没有错误,ondataavailable 回调按预期每 500 毫秒调用一次。但是,对于其中四分之三的调用,提供的数据大小为零。这向我表明,数据被分组为大约两秒的 block (可能是由于所使用的视频编码的限制)。
是否可以让 MediaRecorder 提供更细粒度的数据?如果不是,以低延迟将视频数据从 userMedia 流获取到服务器的最佳方法是什么?特定于 Chrome 或 Firefox 的界面会很好,但同时适用于两者的界面会更好。
<html>
<body>
<h1>MediaRecorder Test</h1>
<video id="video" width="640" style="border: 1px solid black"></video>
</body>
</html>
<script>
// The variable that holds the video stream
var mediastream = null;
// Start video capture (and provide a way to stop it)
navigator.mozGetUserMedia ( { video: true, audio: false },
function(stream_arg) {
mediastream = stream_arg;
var vendorURL = window.URL || window.webkitURL;
video.src = vendorURL.createObjectURL(mediastream);
video.play();
recordStream();
},
function(err) { console.log("Error starting video stream: " + err); }
);
// Record the stream
var recorder = null;
function recordStream() {
recorder = new MediaRecorder(mediastream);
recorder.ondataavailable = function(ev) {
console.log("Got: "+ev.data.size);
};
recorder.start(500);
}
</script>
最佳答案
您传递给 MediaRecorder 的 500 毫秒间隔是建议性的。使用的编解码器可能需要更大的数据/时间 block 才能使用。它可能会尽可能快地为您提供数据。
如果您需要低延迟,MediaRecorder 是不适合这项工作的工具。常规 WebRTC 调用将使用针对延迟而非质量进行优化的编解码器设置。我听说过有人在 WebRTC 服务器端录制,但我不知道有什么开源软件可以让我立即做到这一点。
也许在未来的某一天,MediaRecorder API 将允许我们选择编解码器参数,这将不是问题。
关于javascript - Firefox 的 MediaRecorder 接口(interface)每两秒只提供一次新的视频数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24677005/