我正在实现 MediaRecorder API 作为记录 webm blob 以用作直播中的片段的一种方式。我已经获得了我需要的功能,但在调用时遇到了 Chrome 崩溃的问题,MediaRecorder.stop()
并且MediaRecorder.start()
定期多次崩溃。
下面是录制代码:
let Recorder = null;
let segmentBuffer = [];
let recordInterval = null;
let times = 0; //limiter for crashes
function startRecording() {
Recorder = new MediaRecorder(LocalStream, { mimeType: 'video/webm;codecs=opus, vp8', audioBitsPerSecond: 50000, videoBitsPerSecond: 1000000, });
//error evt
Recorder.onerror = (evt) => {
console.error(evt.error);
}
//push blob data to segments buffer
Recorder.ondataavailable = (evt) => {
segmentBuffer.push(evt.data);
}
//start initial recording
Recorder.start();
//set stop/start delivery interval every 5 seconds
recordInterval = setInterval(() => {
//stop recording
Recorder.stop();
//here to prevent crash
if (times > 5) {
Recorder = null;
console.log('end')
return;
}
times++;
//check if has segments
if (segmentBuffer.length) {
//produce segment, this segment is playable and not just a byte-stream due to start/stop
let webm = segmentBuffer.reduce((a, b) => new Blob([a, b], { type: "video/webm;codecs=opus, vp8" }));
//unset buffer
segmentBuffer = [];
//handle blob ie. send to server
handleBlob(webm)
}
//restart recorder
Recorder.start();
}, 5000);
}
我还研究了性能,发现每次启动/停止都会启动一个新的音频和视频编码器线程。我认为这是主要问题,因为将间隔设置为 10 秒而不是 5 秒会创建更少的编码线程。多个编码线程的建立导致 chrome 滞后,然后在几次通过后最终崩溃。
如何在仍然能够启动/停止 MediaRecorder 的同时防止发生多个编码线程(启动/停止是我发现实现可单独播放的 webm 文件的唯一方法,否则每个后续 blob 都缺少 webm 标头部分)。