Видеотрансляция через сервер NodeJS socket.io - проблема - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь написать потоковое приложение 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;

...