Сегменты временного интервала MediaRecorder - воспроизводится только первый сегмент

У меня последняя версия Chrome:

 var options = { mimeType: "video/webm;codecs=vp8" };
 internalMediaRecorder = new MediaRecorder(internalStream, options);
 internalMediaRecorder.ondataavailable = function (blob) {
        // put blob.data into an array
        var src = URL.createObjectURL(blobData.segment);
        const $container = $("body");
        const $video = $("<video id='" + blobData.ts + "-" + blob.data.size + "' controls src='" + src + "'></video>").css("max-width", "100%");
        $container.prepend($video);
        // if I stop/start the recorder, I get playable segments here, separated by unplayable mini-segments from onDataAvailable because I call stop right after processing a video.  I can "approximate" desired behavior by doing this and then ignoring blobs that are less than some threshhold to ignore the "dead gap" segments.
 }
 internalMediaRecorder.start(segmentLengthInMs); // every 5s

Затем я составляю массив из 5 сегментов - данные blob доступны. Однако когда я создаю URL-адрес для каждого из этих сегментов:

 URL.createObjectURL(videoSegment)

Воспроизводится только первое видео. Почему это?

ОБНОВЛЕНИЕ

Если я останавливаю / запускаю рекордер в onDataAvailable, я получаю здесь воспроизводимые сегменты, разделенные невоспроизводимыми мини-сегментами из onDataAvailable, потому что я вызываю остановку сразу после обработки видео. Я могу «приблизить» желаемое поведение, сделав это, а затем игнорируя капли, размер которых меньше некоторого порогового значения, чтобы игнорировать сегменты «мертвого промежутка». Это пахнет ногами, и я бы хотел, чтобы работала правильная сегментация, если это возможно.


person SB2055    schedule 30.05.2017    source источник
comment
Когда вы использовали метод start / stop для события dataAvailable, испытывали ли вы какие-либо проблемы с производительностью (отставание / сбой)? В настоящее время я использую тот же метод для получения отдельных воспроизводимых сегментов, но кажется, что этот метод вызывает сбой Chrome после нескольких проходов.   -  person Pj Rigor    schedule 05.10.2019


Ответы (1)


Ожидается, что согласно спецификации

UA ДОЛЖЕН записывать поток таким образом, чтобы исходные дорожки можно было получить во время воспроизведения. Когда возвращается несколько BLOB-объектов (из-за временного интервала или requestData ()), отдельные BLOB-объекты не обязательно должны воспроизводиться, но ДОЛЖНА воспроизводиться комбинация всех BLOB-объектов из завершенной записи.

Полученные большие двоичные объекты не являются необработанными видеоданными, они закодированы с запрошенным типом MIME. Итак, вам нужно объединить все капли в правильном порядке, чтобы создать воспроизводимый видеофайл.

var options = { mimeType: "video/webm;codecs=vp8" };
var recordedBlobs = [];
internalMediaRecorder = new MediaRecorder(internalStream, options);
internalMediaRecorder.ondataavailable = function (event) {
    if (event.data && event.data.size > 0) {
        recordedBlobs.push(event.data);
    }
}
internalMediaRecorder.start(segmentLengthInMs); // every 5s

function play() {
   var superBuffer = new Blob(recordedBlobs, {type: 'video/webm'});
   videoElement.src = window.URL.createObjectURL(superBuffer);
}

См. демонстрацию

person Ajay    schedule 30.05.2017
comment
Спасибо, Аджай. Что, если я хочу, чтобы сегменты были видео, воспроизводимыми по отдельности? - person SB2055; 30.05.2017
comment
Какой у вас вариант использования? Если вам нужны живые данные, напрямую воспроизведите поток. Назначение регистратора - генерировать закодированные (сжатые) данные. Если вам нужно только видео, визуализируйте видеопоток на холсте, сделайте снимок (15 раз в секунду) и визуализируйте данные привязки на холсте назначения. - person Ajay; 30.05.2017
comment
Пример использования: мне нужно записать n секунд непрерывного воспроизводимого видео. - person SB2055; 30.05.2017
comment
Я просто попробовал этот метод супербуфера, чтобы проверить, работает ли он и работает ли первый сегмент, но как только я дойду до второго сегмента, воспроизведение видео останавливается. Есть идеи, почему это могло произойти? - person SB2055; 30.05.2017
comment
Вам нужно дождаться завершения записи. - person Ajay; 30.05.2017