使用FFmpeg将RTMP流转为视频文件出现Broken pipe报错如何解决
问题原因与解决方案
核心报错说明
rtmp://localhost:1935/live/app: Broken pipe 报错本质是拉流转码进程和推流进程的RTMP连接意外中断,结合你给出的命令,大概率是启动顺序、参数设置或者输出容器兼容性问题导致的。
具体解决步骤
- 调整命令启动顺序:先运行推流命令,等推流命令输出
Listening on rtmp://0.0.0.0:1935这类监听成功提示后,再运行拉流转码命令,不要两个命令同时启动,避免拉流端发起请求时推流端还没完成端口监听导致连接失败。 - 修正推流命令参数:你当前用的
-listen 1参数会让FFmpeg作为RTMP服务端监听连接,但默认单次连接断开后就会自动退出,可以加上-timeout 0参数让它保持监听状态,修改后的推流命令如下:
ffmpeg -i ./video.mp4 -c copy -f flv -listen 1 -timeout 0 -flvflags no_duration_filesize rtmp://localhost:1935/live/app
- 修正拉流转码命令参数:直接把RTMP直播流裸流复制到MP4容器时,MP4需要写入固定文件头元数据,而直播流没有固定时长会导致写入异常中断,可以从以下两种修改方案里二选一:
- 保存为FLV格式(兼容性最好,最适合直播流本地保存):
ffmpeg -i rtmp://localhost:1935/live/app -acodec copy -vcodec copy test.flv- 保存为支持流式写入的MP4格式:
ffmpeg -i rtmp://localhost:1935/live/app -acodec copy -vcodec copy -movflags +faststart+frag_keyframe+empty_moov test.mp4 - 检查端口占用:确认1935端口没有被其他流媒体服务(比如Nginx RTMP模块、SRS服务)占用,端口冲突会直接导致两个FFmpeg进程的监听、连接逻辑异常。
验证流程
按照顺序启动修改后的推流命令→等待监听成功提示→启动修改后的转码命令,运行10秒左右先按q停止转码进程,再停止推流进程,打开输出的视频文件确认内容正常即可。
内容的提问来源于stack exchange,提问作者kup
相关产品推荐
相关产品推荐

