搭载nginx-rtmp模块的FFmpeg需多次重启才可工作求助
FFmpeg转RTMP流不稳定,需多次重启才能正常工作的问题排查
问题详情
使用以下命令将RTP流转换为RTMP流:
ffmpeg -i rtp://192.168.1.74:8000/live -vcodec libx264 -f flv rtmp://192.168.1.74:1935/picam/stream
启动后无法通过rtmpdump -z获取视频,必须重启FFmpeg 7-8次才可能正常工作。已完成的排查动作:
- 重新编译Nginx源码,无效果
- 端口1935已确认开放
- 抓包显示RTMP握手完成后无有效流数据返回,客户端请求未得到正常响应
解决建议
1. 修复FLV头缺失问题
RTP流通常无初始时长或文件大小标记,导致FFmpeg生成的FLV头不完整,添加-flvflags no_duration_filesize强制跳过这些字段:
ffmpeg -i rtp://192.168.1.74:8000/live -vcodec libx264 -flvflags no_duration_filesize -f flv rtmp://192.168.1.74:1935/picam/stream
2. 生成连续的时序戳
RTP流可能存在时序混乱,添加-fflags +genpts让FFmpeg生成连续的PTS(显示时间戳),确保RTMP流时序正常:
ffmpeg -fflags +genpts -i rtp://192.168.1.74:8000/live -vcodec libx264 -f flv rtmp://192.168.1.74:1935/picam/stream
3. 调整Nginx-RTMP配置
在Nginx的RTMP模块配置中添加wait_key on,等待关键帧后再向客户端推送流,避免客户端因无关键帧无法解码:
rtmp { server { listen 1935; application picam { live on; wait_key on; meta copy; } } }
修改后重启Nginx生效。
4. 验证RTP源稳定性
先使用ffplay rtp://192.168.1.74:8000/live测试RTP输入流是否稳定,若存在丢包、卡顿或无输出,优先修复RTP发送端的配置(如调整发送缓冲、编码参数)。
5. 升级FFmpeg版本
部分旧版FFmpeg的RTMP推流存在握手时序或兼容性bug,升级到最新稳定版(如6.x或7.x分支)可解决此类偶发问题。
内容的提问来源于stack exchange,提问作者KonstSergP
相关产品推荐
相关产品推荐

