2

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

4

1 回答 1

0

看来这是chrome中的一个错误:

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

我不确定你能做些什么来解决它。

于 2020-05-07T22:25:30.750 回答