Правильный способ использования 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);