потоковая передача getUserMedia на сервер

Я новичок в двоичных данных и getUserMedia, каков был бы рекомендуемый способ потоковой передачи getUserMedia (видео/аудио) на сервер, а затем подготовить поток (видео/аудио) для других соединений?

моей первоначальной мыслью было отправить данные через websockets, а затем записать данные в файл (mp4) следующим образом:

getUserMedia -->(websockets)--> server -->(file.mp4)--> video.src.

Я смотрел на MediaStreamRecorder и я могу отправить буфер так:

multiStreamRecorder.ondataavailable = function (blobs) {
    socket.emit('blobs', blobs)
};

на сервер я получаю

{ audio: <Buffer 52 49 46 46 2c 10 04 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 01 00 44 ac 00 00 10 b1 02 00 02 00 10 00 64 61 74 61 00 10 04 00 f8 ff 04 00 0d 00 ... >,
  video: <Buffer 1a 45 df a3 40 20 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 40 04 77 65 62 6d 42 87 81 02 42 85 81 02 18 53 80 67 10 0a 41 54 15 49 a9 66 ... >,
  onDataAvailableEventFired: true }

теперь я думаю, что я должен записать это в файл, обслуживать этот файл, а затем запросить этот файл из элемент.. Если все правильно, как я могу написать файл в файловую систему? или я делаю что-то не так?

Я понимаю, что WebRTC имеет функциональность p2p, я бы обслуживал видеопоток до ~50 или более клиентов, поэтому это не вариант.

обновление с websocket решение:

теперь я излучаю данные обратно через websockets так:

socket.on('blobs', function(data){
    socket.emit('blobs', data)
})

и на стороне клиента, толкая его в mediaSource и video элемент timestampOffset чтобы сохранить ее гладкой.

var mediaSource = new MediaSource(),
    mediaBuffer,
    // init duration of 0 seems fine
    duration = 0;

var video = $('video').get(0);
video.src = window.URL.createObjectURL(mediaSource);

mediaSource.addEventListener('sourceopen', function(e) {
    mediaBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"')
    mediaBuffer.addEventListener('update', function() {
        // wait for mediaBuffer update to fire before setting the new duration
        duration = video.duration
    });
}, false);

socket.on('blobs', function (data) {
    mediaBuffer.timestampOffset = duration;
    mediaBuffer.appendBuffer(new Uint8Array(data.video));
});

1 ответов


чтобы сделать эту работу правильно, вам нужен сервер, чтобы" говорить " WebRTC, а также. Использование websockets не даст вам желаемого результата и не будет таким отзывчивым, как WebRTC - это не будет в режиме реального времени.

чтобы запустить WebRTC на сервере, вы можете использовать стек WebRTC вwebrtc.org или OpenWebRTC в качестве отправной точки, используйте GStreamer или пойти на что-нибудь более полное. Хорошие проекты фреймворков media server для запуска WebRTC от Kurento, предлагая широкий набор и Янус.

из-за характера вашего вопроса я предлагаю начать с одной из более полных фреймворков media server, упомянутых выше.