#mediarecorder
#mediarecorder
Вопрос:
Я использую с MediaRecorder
function getUserMediaSuccess(stream) {
$videoElement[0].srcObject = stream;
$videoElement[0].autoplay = true;
$videoElement[0].muted = true;
$videoElement[0].controls = false;
mediaRecorder = new MediaRecorder(stream, settings.recorderOptions);
}
Как только запись будет завершена, я хочу воспроизвести записанные фрагменты.
Я попытался с:
const blob = new Blob(chunks, { 'type' : settings.recorderOptions.mimeType});
$videoElement[0].src = window.URL.createObjectURL(blob);
а также с
$videoElement[0].pause();
$videoElement[0].removeAttribute('src');
$videoElement[0].load();
$videoElement[0].src = settings.filename;
$videoElement[0].controls = true;
Я не могу остановить видеоэлемент показа веб-камеры в реальном времени.
Я могу воспроизвести записанное видео в ДРУГОМ видеоэлементе. Но я хочу использовать ТО ЖЕ САМОЕ, что используется для отображения веб-камеры.
Я также пробовал:
localStream.getTracks().forEach(function(track) {
track.stop();
});
Что дает черный экран, но затем я не могу снова воспроизвести записанное видео.
Комментарии:
1. пожалуйста, попробуйте привести пример в виде jsfiddle или здесь в качестве встроенного примера — так проще воспроизвести ваше поведение. вы пробовали с примером на developer.mozilla.org/en-US/docs/Web/API/MediaRecorder#example
2. Установите значение
srcObject
null
после остановки записи:$videoElement[0].srcObject = null;
Ответ №1:
я думаю, что вы сделали большинство вещей правильно.
основываясь на примере Mozilla MediaRecorder и некоторых других исследованиях, я думаю, что волшебство заключается в переключении между использованием srcObject
и src
:
srcObject
для MediaStream (getUserMedia live preview)src
сwindow.URL.createObjectURL
этот фрагмент работает (при запуске на локальном хосте или по протоколу https — (возможно, встраивание не полностью заполняет все параметры безопасности, чтобы разрешить доступ к getUserMedia ..)
const videoEl = document.getElementById('theVideoElement');
let mediaRecorder = null;
let mediaChunks = [];
function recordStart() {
console.log('recordStart..');
if (navigator.mediaDevices amp;amp; navigator.mediaDevices.getUserMedia) {
navigator.mediaDevices.getUserMedia (
{
audio: true,
video: true,
}
)
.then( stream => {
videoEl.srcObject = stream;
mediaRecorder = new MediaRecorder(stream);
mediaRecorder.addEventListener('dataavailable', event => {
mediaChunks.push(event.data);
});
mediaRecorder.addEventListener('stop', event => {
console.log("recorder stopped");
const blob = new Blob(mediaChunks, { 'type' : 'video/webm' });
mediaBlobURL = window.URL.createObjectURL(blob);
mediaChunks = [];
videoEl.src = mediaBlobURL;
});
mediaRecorder.start();
console.log("recorder started", mediaRecorder.state);
window.setTimeout(event => {
console.log("time is over.");
mediaRecorder.stop();
console.log(mediaRecorder.state);
console.log("recorder stopped");
// stop getUserMedia stream - this way the cam and mic gets released.
for (const track of stream.getTracks()) {
track.stop();
}
videoEl.srcObject = null;
console.log("stream stopped.");
}, 3000);
})
.catch( err => {
console.error(`The following getUserMedia error occurred:n ${err}`);
});
} else {
console.error('getUserMedia not supported on your browser!');
}
}
console.info('******************************************');
window.addEventListener('load', (event) => {
console.info('All resources finished loading.');
const buttonEl = document.getElementById('button_start');
buttonEl.addEventListener('click', (event) => {
console.info('click!');
recordStart();
});
});
button {
display: block;
}
video {
display: block;
border: solid 1px black;
}
<button id="button_start">
start
</button>
<video
id="theVideoElement"
autoplay
controls
>
</video>