Правильный способ использования MediaRecorder с аргументом отрезка времени, указанным в start

Прочитав эту страницу https://developer.mozilla.org/en-US/docs/Web/API/MediaRecorder.start, я написал свой собственный код:

var mediaConstraint = { video: true, audio: true };
navigator.getUserMedia(mediaConstraint, function(stream) {
    var vendorURL = window.URL || window.webkitURL;
    _video = document.querySelector('#recordingCamera');
    _video.src = vendorURL.createObjectURL(stream);
    _video.play();

    var mediaRecorder = new MediaRecorder(stream);
    mediaRecorder.start(3000);
    mediaRecorder.ondataavailable = function(e) {
        var replay = document.querySelector('#replay');
        replay.src = window.URL.createObjectURL(e.data);
        replay.play();
    }
}, function(error){

});

Я ожидаю, что через 3 секунды после того, как элемент #recordingCamera отобразит контент с моей камеры, я увижу воспроизведение контента в элементе #replay.
Но элемент #replay просто проигрывает только 3 секунды. После этого элемент #recordingCamera по-прежнему отображает содержимое камеры, но ничего больше для элемента #replay.
При проверке консоли я обнаружил следующие сообщения:

Media resource blob:http://localhost:8081/634f6237-17a9-475d-89bb-2c6ca0b48eb6 could not be decoded.
Media resource blob:http://localhost:8081/d0b95463-f9bc-4b0f-bd0d-40ae3152181f could not be decoded.
Media resource blob:http://localhost:8081/535ab990-0ee2-4ec0-adac-2d5d6917f6f3 could not be decoded.

Доступность данных по- прежнему срабатывает, но с данными что-то не так.

Мой вопрос:

  • Это ошибка Firefox?
  • Если нет, то как правильно использовать MediaRecorder с аргументом временного интервала, заданным параметром start?

2 ответа

Решение

Хорошо, я нашел решение, что MediaSource API

var mediaSource = new MediaSource();
var replay = document.querySelector('#replay');
replay.src = window.URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', function(e) {
    console.log('sourceopen')
    sourceBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vorbis,vp8"');
});

var mediaConstraint = { video: true, audio: true };
navigator.getUserMedia(mediaConstraint, function(stream) {
    var mediaRecorder = new MediaRecorder(stream);
    mediaRecorder.start(3000);
    mediaRecorder.ondataavailable = function(e) {
        var fileReader = new FileReader();
        fileReader.onload = function() {
            sourceBuffer.appendBuffer(fileReader.result);
        };
        fileReader.readAsArrayBuffer(e.data);
    }
}, function(error){});

Обратите внимание, что в Firefox вам нужно установить флаг enable-media-source в true.

Это похоже на ошибку в Firefox. Если вы позвоните mediaRecorder.start с меньшим интервалом временного интервала, BLOB-объект будет воспроизводиться без использования MediaSource. Обратите внимание, что MediaSource обычно не был доступен до Firefox 42, поэтому вы не можете полагаться на его доступность.

mediaRecorder.start(1000);

Другие вопросы по тегам