如何实现OBS推RTMP到nginx后转WebRTC并提取RTMP分片
Nginx-RTMP流提取与转WebRTC的实操说明
你目前的配置问题本质是对pull指令的功能理解完全错位,大概率是看到文档里的指令说明,混淆了Nginx作为远端流拉取客户端、和作为本地推流接收服务器的两种角色。pull指令的作用是让Nginx-RTMP作为客户端,主动从其他远端RTMP服务器拉取流到本地做转发,根本不是用来把Nginx收到的本地推流落盘成文件的,方向完全反了,自然不会在你的目录下生成任何和RTMP相关的文件。
认知前提澄清
- 你之前开启
hls on时能在目录下看到分片文件,是因为HLS模块专门实现了“流拆解成ts分片+生成m3u8索引”的固定逻辑,这是HLS协议规范要求的能力,不是RTMP协议本身的特性。 - RTMP是基于长连接的实时流协议,本身没有天然的“分片”结构,nginx-rtmp模块默认也不会把内存里转发的RTMP流落盘成独立文件,官方文档里根本不存在符合你预期的“把RTMP流拆成小文件存在目录下”的指令。
- 你的转WebRTC链路根本不需要靠读落盘分片的方式取流,这种取流方式的延迟甚至会比直接用RTMP拉流高很多,完全偏离你要低延迟、替代HLS的初始目标。
可直接落地的操作方案
- 先把基础推流链路跑通:写好标准的Nginx-RTMP应用配置,确保OBS推流到对应RTMP地址后,通过同地址的RTMP拉流能正常拿到视频,不存在鉴权不通过、路径不匹配的问题。
- 删掉之前配置里所有误用的
pull指令。这个配置在你的场景里没有任何价值,还可能触发无意义的远端拉流请求,白白占用带宽。 - 直接用本地的RTMP转WebRTC程序作为RTMP客户端,拉取Nginx上已经存在的推流地址作为输入源。目前所有主流的开源实时流媒体转换工具,都支持直接输入RTMP地址作为流输入,不需要等Nginx生成任何落地文件。这种方式取到的是Nginx实时转发的原始RTMP流,端到端延迟可以控制在几百毫秒级,完全满足你替代高延迟HLS的需求。
- 如果你确实需要拿到Nginx侧的流数据落盘,只需要在RTMP应用块下开启录制指令,就可以把收到的RTMP流完整录制为音视频文件。但要注意,录制生成的是离线完整文件,不是实时流数据,完全不能用来做实时WebRTC转发的输入,只适合做存档使用。
内容的提问来源于stack exchange,提问作者wisdomtoothman
相关产品推荐
相关产品推荐

