在实际为其编写代码之前,我一直在尝试制作视频流服务器的原型。因此,我使用 VLC 使用以下命令在我的服务器上进行流式传输:
cvlc video.mpg --loop --sout '#transcode{vb=0,vcodec=mpgv,fps=20,ab=0,acodec=mpga,channels=2,venc=ffmpeg}:rtp{mux=ts,ttl=10,dst=127.0.0.1,port=9554}'
流媒体服务开始运行于本地主机在端口 9554 上。经过一些研究,我未能将 VLC 流绑定到公共 IP,这是另一个值得在另一个页面上分享的问题。
问题是,为了使流从外部世界可见,我使用了 NginX 反向代理,并使用HTTP协议在 VLC 上串流实时传输协议。
cvlc video.mpg --loop --sout '#transcode{vb=0,vcodec=mpgv,fps=20,ab=0,acodec=mpga,channels=2,venc=ffmpeg}:http{mux=ts,ttl=10,dst=0.0.0.0:9554/live}'
嗯,在我的手机上观看流媒体视频很成功,只是我没有使用实时传输协议协议。
当我不知道如何反向代理时,问题就出现了UDP流。当然,NginX 无法工作,因为它只能代理 HTTP,当然,在较新的版本上还代理 TCP。
所以,知道如何反向代理UDP流?
如果您知道如何将 VLC 绑定到公共地址而不是本地主机,也欢迎任何其他相关答案。
答案1
RTP 与 RTP 控制协议 (RTCP) 结合使用。
RTP 承载媒体流(例如音频和视频),而 RTCP 用于监控传输统计数据和服务质量 (QoS),并帮助多个流的同步。
通常,RTP 将在偶数 UDP 端口上发送,而 RTCP 消息将在下一个更高的奇数端口上发送。
我认为这就是为什么你未能将 RTP 绑定到你忘记了 RTCP 的公共 IP 地址。
我再次认为您需要的是 DNAT,而不是反向代理。
我的建议是,如果您想在互联网上流式传输视频和音频,请使用 HLS 而不是 RTP,它比 RTP 和其他类似协议更灵活,并且您可以使用 Nginx 来服务 HLS。
答案2
RTP 通常也可以通过 TCP 工作。通常,?transport=tcp
在链接末尾添加是可行的,但我不确定你的情况。