如何在不涉及中间服务器的情况下直接从 HTML 流式传输 RTMP 视频

Posted

技术标签:

【中文标题】如何在不涉及中间服务器的情况下直接从 HTML 流式传输 RTMP 视频【英文标题】:How to directly stream out RTMP video from HTML without involving a middle server 【发布时间】:2020-08-27 19:24:43 【问题描述】:

我认为从浏览器直接向 RTMP 服务器建立 RTMP 输出流很简单。当我看到一些流媒体视频 API 提供商提供现成的 iFrame url 时,我觉得这很有可能,这些 URL 可以捕获 PC 摄像头并在嵌入 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);

     
)

【问题讨论】:

【参考方案1】:

这是不可能的。

浏览器不支持 RTMP,也不允许添加支持所需的原始套接字。

而且 RTMP 不支持 VP9,因为它的价值。

【讨论】:

看起来像使用标准流协议直接从浏览器流式传输的未来仍然存在。 RTMP 是标准的。 而且永远不会因为它被认为是一种传统格式并且正在慢慢被取代。 哦,好的。仅供参考 - 最新的标准流协议是什么? 太多无法列出。 RTMP、RTP、RTSP、WebRTC、zixi、RIST、aspera、SRT JITS 等等。【参考方案2】:

@szatmary 正确指出浏览器无法生成 RTMP 流,而且很可能永远无法生成。

如果您连接在 ondataavailable 事件处理程序中获得的缓冲区,您将获得一个 webm 格式的媒体文件。您可以使用 Web 套接字或 socket.io 将缓冲区一一推送到服务器。服务器可以将它们组合成一个文件,然后您可以使用许多不同的媒体播放器播放该文件,包括大多数浏览器中内置的播放器。

但是 webm 数据必须使用 TCP 或其他无损网络协议传输。它对 RTMP 或 RTSP 等数据报协议中固有的丢失数据包没有弹性。

您可能希望将 WebRTC 与所谓的选择性转发单元服务器一起使用。浏览器绝对可以起源于 WebRTC。 WebRTC 对丢包具有弹性。

一些商业供应商以每分钟的价格提供这些服务。你可以在 intertoobz 上找到各种评论,比如这个。 https://www.callstats.io/blog/2017/10/17/sdk-comparison

您可以尝试其中的一两个,看看它们是否满足您的应用需求。如果他们这样做,那么您可以做出明智的“制造与购买”决定。

【讨论】:

以上是关于如何在不涉及中间服务器的情况下直接从 HTML 流式传输 RTMP 视频的主要内容,如果未能解决你的问题,请参考以下文章

如何在不发出单独请求的情况下将元数据和音轨从广播流中分离出来

HTML5 视频播放器显示以在浏览器中启用 Flash。如何在不启用 Flash 的情况下播放流视频?

如何在不显示中间视图的情况下通过多个视图展开

如何在不写入输出流的情况下从 ZipInputStream 获取每个 ZipFile 条目的字节/内容?

如何在不触发 ConcurrencyException 的情况下删除相关的中间实体记录?

如何在不使用请求的情况下直接从代码调用烧瓶端点