Как напрямую транслировать RTMP-видео из HTML без участия промежуточного сервера

Я думал, что легко установить выходной поток RTMP из браузера непосредственно на RTMP-сервер. Это казалось мне возможным, когда я увидел, что некоторые поставщики API потокового видео предлагают готовые URL-адреса iFrame, которые захватывают камеру ПК и устанавливают поток со своими серверами при внедрении в Html.

Однако - ошибся.

Достать кусочки своими руками довольно легко. Но как отправить их на RTMP-сервер?

 navigator.getUserMedia({
       video: true,
       audio: true
 },

 function (stream) {

     var options = { mimeType: "video/webm; codecs=vp9" };
     mediaRecorder = new MediaRecorder(stream, options);

     mediaRecorder.ondataavailable = handleDataAvailable;
     mediaRecorder.start();

     function handleDataAvailable(event) {

       if (event.data.size > 0) {

         console.log(recordedChunks);

    } 
})

person Charlie    schedule 12.05.2020    source источник


Ответы (2)


Это невозможно.

Браузеры не поддерживают RTMP и не допускают необработанных сокетов, необходимых для добавления поддержки.

А RTMP не поддерживает VP9, ​​чего уж там стоит.

person szatmary    schedule 12.05.2020
comment
Похоже, стриминг прямо из браузера с использованием стандартных протоколов стриминга остается делом будущего. - person Charlie; 12.05.2020
comment
RTMP стандартный. - person szatmary; 12.05.2020
comment
И никогда не будет, поскольку он воспринимается как устаревший формат и очень медленно вытесняется. - person szatmary; 13.05.2020
comment
Ох, хорошо. Просто для информации - каковы последние стандартные протоколы потоковой передачи? - person Charlie; 13.05.2020
comment
Слишком много, чтобы перечислить. RTMP, RTP, RTSP, WebRTC, zixi, RIST, aspera, SRT JITS и многие другие. - person szatmary; 13.05.2020
comment
Хорошо понял. Однако я вижу, что многие поставщики API потокового видео по-прежнему выбирают RTMP. Еще раз спасибо за ваш вклад. - person Charlie; 13.05.2020

@szatmary правильно указал, что браузеры не могут генерировать потоки RTMP и, скорее всего, никогда не смогут.

Если вы объедините буферы, полученные в обработчике событий ondataavailable, вы получите медиафайл в формате webm. Вы можете отправить буферы один за другим на сервер, используя веб-сокет или socket.io. Сервер может собрать их в файл, который затем можно воспроизвести с помощью множества различных медиаплееров, в том числе встроенных в большинство браузеров.

Но данные webm должны передаваться с помощью TCP или другого сетевого протокола без потерь. Он не устойчив к потерянным пакетам данных, присущим протоколам дейтаграмм, таким как RTMP или RTSP.

Возможно, вы захотите использовать WebRTC с так называемым сервером Selective Forwarding Unit. Браузеры определенно могут создавать WebRTC. И WebRTC устойчив к потере пакетов.

Некоторые коммерческие поставщики предлагают эти услуги по поминутной цене. Вы можете найти различные обзоры на intertoobz, подобные этому. https://www.callstats.io/blog/2017/10/17/sdk-comparison

Вы можете попробовать один или два из них, чтобы увидеть, соответствуют ли они потребностям вашего приложения. Если да, то вы можете принять обоснованное решение «делать или покупать».

person O. Jones    schedule 15.05.2020