запуск / остановка MediaRecorder API приводит к сбою Chrome - PullRequest
0 голосов
/ 05 октября 2019

Я реализую MediaRecorder API как способ записи веб-блобов для использования в качестве сегментов в прямом эфире. Я получил необходимую функциональность, но столкнулся с проблемой сбоя 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).

...