如何使用WebRTC将视频流传输到RTMP?

7
我正在尝试构建一个服务,从浏览器向客户端流式传输屏幕(类似于twitch)。
我已经成功构建了具有rtmp的工作nginx服务器,并使用OBS进行了测试。那很好用。
我的问题是如何使用WebRTC从浏览器(而不是从OBS或其他广播器)向NGINX服务器通过RTMP流式传输屏幕?

为什么选择RTMP呢?答案很简单:你不需要。你可以使用WebRTC代替。 - deceze
2
你能告诉我你的意思吗? - Dils Matchanov
@deceze RTMP并不像WebRTC那样时尚和酷,但是很多设备仍然支持它。而SRT或RIST是更好的选择来替代RTMP,不仅仅是WebRTC,特别是对于广播行业而言。PS:只有WebRTC可用于网页发布直播流,因此将WebRTC转换为RTMP/SRT/RIST进行直播流传输是有意义的。 - Winlin
2个回答

8
对于RTSP<->WebRTC / RTMP<->WebRTC转换,您需要运行一些能够使用所有这些格式/协议并且可以在它们之间进行转码的WebRTC网关/媒体服务器软件。尝试使用Wowza / Unreal Media Server / Flashphoner。https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems 因此,在您的情况下,您想通过WebRTC(必须使用H264编解码器)从浏览器将屏幕发布到媒体服务器,然后使用nginx-rtmp模块从媒体服务器拉取RTMP流到nginx服务器。
请注意,反过来也是可能的:您可以通过RTMP将流推送到媒体服务器(例如OBS屏幕捕获),然后通过WebRTC将这个流从媒体服务器发送给Web浏览器。
这些转换的主要问题在于编解码器的兼容性:视频必须使用H264,但如果您需要音频,则必须执行Opus到AAC的转码。

6

SRS(Simple Realtime Server) 能够将 WebRTC 和 RTMP 相互转换。

WebRTC to RTMP 用于 H5 发布者进行实时流传输。由于 RTMP 现在已被禁用(截至2021年12月),因此通过 H5 发布流的唯一方法是使用 WebRTC。我们还需要将 WebRTC 转换为 RTMP,这使我们可以在其他平台上重复使用该流。

它的工作原理如下:

Chrome --WebRTC---> SRS ---RTMP--> YouTube, VLC, etc.
       H.264+OPUS       H.264+AAC

注意:SRS将WebRTC/OPUS转换为RTMP/AAC,因此每个流占用约2%的CPU。
请按照此文档将WebRTC转换为运行在本地主机上的RTMP。如果您需要在互联网上使用网页,则需要设置HTTPS,因为WebRTC需要localhost或HTTPS网页才能访问摄像头,请参见此文档
SRS还支持RTMP to WebRTC,这是低延迟的实时流。一般来说,RTMP的延迟约为3~5秒,而RTMP to WebRTC的延迟约为0.8~1秒。请注意,H5不支持RTMP,但HTTP-FLV可以很好地工作。
除此之外,SRS还支持HTTP-FLV,可使H5播放RTMP,通过mpegts.js实现。延迟也比HLS或LLHLS低。
注意:其他直播功能也很重要,由于与主题无关,请查看SRS的维基百科,如DVR-MP4、DASH、Cluster、HTTP-API等。
也可以使用nginx从SRS拉取RTMP流,或让SRS将RTMP转发到nginx,在通过SRS将WebRTC转换为RTMP流之后。
请不要使用WebRTC进行直播,除非您知道自己在做什么,请阅读为什么以及为什么不要使用WebRTC进行直播

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接