使用Mediamtx转推流时如何解决“runOnReady命令以码0退出”问题
问题分析与解决
核心问题
你遇到的runOnReady命令退出码0但转推失败,主要有两个常见原因:
- 容器内未安装ffmpeg,导致命令执行异常(日志显示退出码0实际是容器对"命令未找到"的异常处理结果)
- ffmpeg启动时流还未完全就绪,连接失败后直接退出
解决方案
1. 确保容器内安装ffmpeg
默认的aler9/rtsp-simple-server:v0.22.2镜像不带ffmpeg,需先安装:
方法一:自定义Docker镜像(推荐)
创建Dockerfile:
FROM aler9/rtsp-simple-server:v0.22.2 RUN apt-get update && apt-get install -y ffmpeg && rm -rf /var/lib/apt/lists/*
修改docker-compose.yml中的镜像配置为构建本地镜像:
services: mediamtx: build: . # 其余端口、挂载配置保持不变
方法二:临时安装(仅用于测试)
进入运行中的容器执行安装命令:
docker exec -it media_mtx_rtsp_server apt-get update && apt-get install -y ffmpeg
2. 修正runOnReady命令
调整ffmpeg参数,增加重试机制,同时使用Mediamtx内置变量避免硬编码地址,适配流就绪延迟:
paths: show/test: runOnReady: ffmpeg -re -i "${RTMP_URL}" -c copy -f flv "rtmp://localhost:1935/compressed/test" -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 5 runOnReadyRestart: yes
${RTMP_URL}是Mediamtx内置变量,自动指向当前路径的RTMP推流地址,无需手动写死-reconnect系列参数让ffmpeg在连接失败时自动重试,解决流刚启动时的就绪延迟问题
3. 验证转推结果
服务启动并推流成功后,用播放器测试转推地址:
ffplay rtmp://localhost:1935/compressed/test
日志排查(若问题仍存在)
修改runOnReady命令重定向ffmpeg日志,排查具体错误:
runOnReady: ffmpeg -re -i "${RTMP_URL}" -c copy -f flv "rtmp://localhost:1935/compressed/test" -reconnect 1 -reconnect_at_eof 1 -reconnect_streamed 1 -reconnect_delay_max 5 2>/tmp/ffmpeg.log
进入容器查看日志内容:
docker exec -it media_mtx_rtsp_server cat /tmp/ffmpeg.log
内容的提问来源于stack exchange,提问作者Emad Helmi
相关产品推荐
相关产品推荐

