Я реализую 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).