我想用OBS通过RTMP流到nginx服务器,然后在本地将RTMP片段发送到WebRTC,这样就可以通过MediaStream传输到客户端。我认为这是可能的,因为它基本上被描述为here。我这样做是因为 HLS 的多秒延迟不适合我正在尝试做的事情。
我在从 nginx 中提取 RTMP 片段时遇到问题,我在 文档 中找到的唯一可行的命令是
pull rtmp://...
。当我尝试这样做时,我没有看到任何文件出现在我的根文件夹中,如果我使用hls on
,我通常会在根文件夹中找到 HLS 文件。有谁知道如何实现我上面想要实现的目标?
谢谢!
这很容易!您可以基于 Pion 的 rtp-to-webrtc 示例。这使您可以轻松地将媒体从 ffmpeg 获取到浏览器中。
你运行的 ffmpeg 命令会像这样
ffmpeg -re -i rtmp://localhost:1935/$app/$name -vn -acodec libopus -f rtp rtp://localhost:6000 -vcodec copy -an -f rtp rtp:localhost:5000 -sdp_file video.sdp
我会考虑转码到 VP8,因为不是所有的浏览器都支持 H264。
—-
如果你想在浏览器中进行亚秒级播放,我会查看 Project Lightspeed,这是你今天最好的选择。
低延迟流确实有更好、更简单的解决方案,无论是隐蔽的 RTMP 到 WebRTC,还是 HTTP-FLV 和 HTTP-TS。
最简单的方法是使用RTMP服务器,比如SRS,它也支持WebRTC播放器,它的工作原理是这样的:
OBS/FFmpeg ---RTMP---> SRS ---WebRTC--> Browser(Chrome)
注意:此解决方案允许您进行少量更改,并且还允许您为某些不支持 WebRTC 的设备(例如移动浏览器)提供两种 HLS。
您可以按照 wiki 设置演示,我相信您可以在 1 分钟内完成它,因为它非常简单,没有任何其他依赖项。
首先,通过docker运行SRS服务器:
docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \
--env CANDIDATE="192.168.1.10" -p 8000:8000/udp \
ossrs/srs:5 ./objs/srs -c conf/rtmp2rtc.conf
注意:请将
设置为您的浏览器可以访问的IP,因为WebRTC信令和媒体使用单独的传输通道。CANDIDATE
然后,使用OBS或其他编码器发布一个RTMP流:
docker run --rm -it ossrs/srs:encoder \
ffmpeg -stream_loop -1 -re -i doc/source.flv \
-c copy -f flv rtmp://192.168.1.10/live/livestream
请打开H5播放器播放WebRTC流:
请注意,这不是低延迟直播的唯一解决方案,我将在下面描述其他解决方案。
对于低延迟直播,除了WebRTC,还有另一种解决方案,使用HTTP-FLV或HTTP-TS。协议很简单,延迟大约1~3s,因为用WebRTC做直播有一些问题,请看this post.
请打开H5播放器播放HTTP-FLV流:
还有一些直播的新功能,例如HEVC现在可以在Safari和Chrome 107+上使用,您可以通过以下方式进行HEVC低延迟直播:
OBS/FFmpeg --SRT---> SRS ---HTTP-TS/HLS--> Safari/Chrome/VLC/ffpay
注意:您可以在here
找到HEVC低延迟演示
我觉得WebRTC和直播不是一回事,直播永不消亡,所以即使是RTMP也会在很长一段时间内被使用
直播的新协议不仅是 WebRTC,还有:
它是这样工作的:
+-------------+
OBS/FFmpeg/Encoder ---RTMP/SRT--> + Live Server +----RTMP/SRT--> Tool
H5/Chrome/Safari ------WebRTC--> + or Platform +----HLS ---> Viewer
+-------------+----HTTP-TS/WebRTC-->Viewer
对于一些使用场景,比如你想对直播进行转码,或者添加logo,或者通过OBS或者其他工具重新制作,
RTMP/SRT
是最好的协议。
要在几乎所有设备和 CDN 上播放直播流,HLS 是最好的解决方案,您可以使用较小的 gop 获得大约 5 秒的延迟,请参阅此post.
如果想做更实时的直播,可以使用HTTP-TS或者HTTP-FLV,延迟大概1~3s,看这个post
WebRTC 也可以播放直播,使用SFU 将RTMP 转换为WebRTC,例如SRS,例如云游戏,请看这个post