我正在实现MediaRecorder API,作为记录webm blob的一种方式,以用作实时流中的片段。我已经获得了所需的功能,但是在定期调用MediaRecorder.stop()
和MediaRecorder.start()
多次时遇到Chrome崩溃的问题。
这里是记录代码:
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);
}
我还参加了表演,发现每次启动/停止都会启动一个新的音频和视频编码器线程。我认为这是主要问题,因为将时间间隔设置为10s和5s会减少编码线程的数量。多个编码线程的建立导致chrome滞后,然后经过几次传递后最终崩溃。
如何在仍然能够启动/停止MediaRecorder的同时防止发生多个编码线程(启动/停止是我发现获得可单独播放的webm文件的唯一方法,否则每个后续blob都缺少webm标头部分)。
看来这是Chrome中的错误:
https://bugs.chromium.org/p/chromium/issues/detail?id=1012378&q=mediaRecorder%20thread&can=2
我不确定您可以采取任何措施来修复它。