启动/停止MediaRecorder API会导致Chrome浏览器崩溃

时间:2019-10-05 03:31:01

标签: javascript google-chrome video-encoding webm web-mediarecorder

我正在实现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标头部分)。

1 个答案:

答案 0 :(得分:0)

看来这是Chrome中的错误:

https://bugs.chromium.org/p/chromium/issues/detail?id=1012378&q=mediaRecorder%20thread&can=2

我不确定您可以采取任何措施来修复它。