从其他流拉取HLS数据推送到RTMP服务器的方案问询
多频道流媒体推送可行方案与技术建议
方案1:修正Nginx RTMP多推配置
你之前的Nginx配置中push语法错误,正确写法是直接指定目标RTMP地址,且支持多条push指令实现多频道推送。以下是调整后的源服务器配置:
worker_processes auto; rtmp_auto_push on; # 开启自动重试推流 events {} rtmp { server { listen 1935; # 监听标准RTMP端口 application live { live on; hls on; hls_path /www/tmp/hls; hls_fragment 10s; hls_playlist_length 5m; # 推送到2-3个目标频道(替换为实际服务器地址) push rtmp://target-server-1/live/your-stream-key; push rtmp://target-server-2/live/your-stream-key; push rtmp://target-server-3/live/your-stream-key; } } } http { server { listen 8080; location /hls { types { application/vnd.apple.mpegurl m3u8; application/octet-stream ts; } root /www/tmp; add_header Cache-Control no-cache; add_header Access-Control-Allow-Origin *; } } }
关键说明:
rtmp_auto_push on会在推流中断后自动重试,提升稳定性- 每条
push对应一个目标频道,需确保目标服务器的RTMP服务正常监听1935端口
方案2:FFmpeg拉取HLS转推多频道
如果源服务器无法直接配置多推,可使用FFmpeg拉取已生成的HLS流,再推送到多个目标RTMP地址,无需修改源服务器配置:
ffmpeg -i http://source-server:8080/hls/your-stream.m3u8 \ -c:v copy -c:a copy \ # 直接复制编码,避免转码消耗资源 -f flv rtmp://target-server-1/live/stream-key \ -f flv rtmp://target-server-2/live/stream-key \ -f flv rtmp://target-server-3/live/stream-key
落地建议:
- 将此命令封装为systemd服务,实现开机自启与异常重启
- 可添加
-re参数强制按流的实际速率推送,避免带宽过载
方案3:使用SRS流媒体服务器简化多推
SRS(Simple RTMP Server)对多推、集群场景支持更友好,配置简洁且内置重试机制,适合流媒体规模化推送需求:
listen 1935; max_connections 1000; srs_log_tank file; srs_log_file ./objs/srs.log; vhost __defaultVhost__ { live { enabled on; hls { enabled on; hls_path ./objs/nginx/html/hls; hls_fragment 10s; hls_playlist_length 5m; } # 多频道推送配置 push { enabled on; destination rtmp://target-server-1/live/stream-key; } push { enabled on; destination rtmp://target-server-2/live/stream-key; } } }
优势:
- 内置推流状态监控、自动重试、低延迟优化
- 支持HTTP-FLV、HLS、DASH等多协议输出,适配不同终端
通用技术建议
- 端口与防火墙:确保源服务器与目标服务器的1935(RTMP)、8080(HLS)端口开放,防火墙允许双向流量
- 编码一致性:推流时使用统一的视频编码(如H.264)、音频编码(如AAC),避免转码导致的延迟与资源消耗
- 状态监控:通过Nginx/SRS日志、FFmpeg输出排查推流中断问题,可添加告警脚本监控流状态
- 跨机房优化:若目标服务器跨机房,优先选择低延迟专线,或考虑CDN中转降低传输延迟
内容的提问来源于stack exchange,提问作者Mehdi Amenein
相关产品推荐
相关产品推荐

