Я пытаюсь написать потоковое приложение UserMedia в nodeJS.Проблема в том, что я хочу транслировать видео с веб-камеры на сервер и получать ответ в другом теге, как ссылка blob src.
У меня есть 1000 мсек, отправляющих на сервер, затем, когда я получаю его, я отправляю ответ посетителю.Мне не нужно сохранять это в файле.
Узел получения данных буфера, я вижу это в консоли.Тот же ответ снова отправляется клиенту, но консоль на стороне клиента отправляет мне сообщение:
Не удалось выполнить 'appendBuffer' для 'SourceBuffer': этот SourceBuffer был удален из родительского источника мультимедиа.
Есть ли у вас какие-либо идеи о том, что происходит внутри него?
Клиентская сторона
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia || navigator.oGetUserMedia;
if(navigator.getUserMedia) {
navigator.getUserMedia({
audio: true,
video: true
}, function(stream) {
videoPlayer.append(player);
var video = document.querySelector("#video");
video.srcObject = stream;
video.onloadedmetadata = function(e) {
video.play();
};
var mediaRecorder = new MediaRecorder(stream, {
mimeType: 'video/webm'
});
mediaRecorder.ondataavailable = function(e) {
let chunk = [];
if (e.data && e.data.size > 0) {
socket.emit("video_chunk", e.data);
} else {
console.log("Media Recorder error.");
}
}
mediaRecorder.start(1000);
}, function(err) {
alert("Error: " + err.message);
}
);
} else {
alert("Your browser doesn't support streaming.");
}
});
if ('MediaSource' in window && MediaSource.isTypeSupported(mimeCodec)) {
var mediaSource = new MediaSource();
preview.src = URL.createObjectURL(mediaSource);
mediaSource.addEventListener('sourceopen', sourceOpen);
} else {
alert("Unsupported MIME type or codec: " + mimeCodec);
}
function sourceOpen(_) {
var mediaSource = this;
var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
socket.on('video_chunk', function(data) {
sourceBuffer.addEventListener('updateend', function() {
if (!sourceBuffer.updating && mediaSource.readyState === 'open') {
mediaSource.endOfStream();
}
preview.play();
});
console.log(new Uint8Array(data));
sourceBuffer.appendBuffer(new Uint8Array(data));
console.log("Adding chunk");
});
}
, а внутренняя сторона выглядит так
function stream(io, app) {
io.on("connection", function(socket) {
console.log("Video Socket connected.");
socket.on("video_chunk", function(data) {
console.log(data);
console.log(data.byteLength/1000 + "kB")
io.emit("video_chunk", data)
})
});
}
module.exports = stream;