MediaMTX 通用 USB 摄像头接入:用 runOnInit + ffmpeg 将 v4l2/dshow 摄像头发布为实时 RTSP 流

发布时间:2026/9/13 5:31:35
MediaMTX 通用 USB 摄像头接入:用 runOnInit + ffmpeg 将 v4l2/dshow 摄像头发布为实时 RTSP 流 MediaMTX 通用 USB 摄像头接入用 runOnInit ffmpeg 将 v4l2/dshow 摄像头发布为实时 RTSP 流【免费下载链接】mediamtxReady-to-use Media-over-QUIC / SRT / WebRTC / RTSP / RTMP / LL-HLS / MPEG-TS / RTP live media server and media proxy that allows to read, publish, proxy, record and playback real-time video and audio streams.项目地址: https://gitcode.com/GitHub_Trending/me/mediamtx本指南讲解如何在 MediaMTX 中接入任何通用的 USB / UVC 网络摄像头通过给路径配置runOnInit钩子让 MediaMTX 在启动时自动拉起 ffmpeg把摄像头Linux 的 V4L2 设备或 Windows 的 DirectShow 设备编码为 H.264 后以 RTSP 协议推入本机从而将任意普通摄像头变成一条可在/cam路径上被全网络读取的实时流。读完本文你将掌握 Linux 与 Windows 两套开箱即用的配置、runOnInit/runOnInitRestart的运行机制与可用环境变量并能根据实际摄像头自由调整分辨率、码率与推流参数。接入思路为什么用 runOnInit 而不是直接配 sourceMediaMTX 的路径path支持多种内置静态源例如rtsp://、rtmp://、srt://等 URL见 internal/conf/path.go 中Source字段的取值校验。但通用 USB 摄像头并不暴露任何网络协议它只是一块本地采集设备Linux 下是/dev/video0Windows 下是 DirectShow 设备因此标准做法是借助runOnInit钩子让 MediaMTX 在路径初始化时执行一条 ffmpeg 命令由 ffmpeg 完成「采集 → 编码 → 以 RTSP 推流回 MediaMTX」的闭环。runOnInit的定义位于 internal/conf/path.go属于路径的 Hooks 配置组RunOnInit string json:runOnInit RunOnInitRestart bool json:runOnInitRestart它的执行由 internal/hooks/on_init.go 中的OnInit函数驱动只要RunOnInit非空路径启动时就会以externalcmd.Cmd拉起该命令并在路径销毁时关闭它。而命令的重启行为由externalcmd包实现查看 internal/externalcmd/cmd.go 可以看到当Restart为 true 时命令每次退出无论是否出错都会等待 5 秒后自动重新拉起直到路径被销毁——这正是runOnInitRestart: yes能保证「ffmpeg 崩溃后自动恢复推流」的底层机制。Linux 接入V4L2 设备 ffmpeg如果你的操作系统是 Linux编辑仓库根目录的 mediamtx.yml把paths部分的内容整体替换为paths: cam: runOnInit: ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -pix_fmt yuv420p -preset ultrafast -b:v 600k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH runOnInitRestart: yes逐段解读这条命令-f v4l2 -i /dev/video0以 V4L2 框架读取第一个摄像头设备如果接入多个摄像头可把设备路径改为/dev/video1、/dev/video2等。-c:v libx264使用软件编码器 libx264 输出 H.264与大多数播放器、HLS/WebRTC 转码链路兼容性最好。-pix_fmt yuv420p强制像素格式为 YUV 4:2:0。这是 H.264 播放兼容性的关键参数——若摄像头原始输出 RGB 等格式不做转换会导致流无法被正常解码播放。-preset ultrafast使用最快编码预设牺牲少量压缩率换取更低的延迟与 CPU 占用适合直播场景。-b:v 600k目标视频码率 600 kbps可按带宽与画质需求调整。-f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH把编码后的流以 RTSP 协议推送给本机 MediaMTX 的 RTSP 服务器目标路径来自环境变量见下文「环境变量」小节。配置完成后保存并重启 MediaMTX。启动时它就会自动拉起 ffmpeg 采集摄像头最终流将出现在路径/cam上。Windows 接入DirectShow 设备 ffmpeg如果你的操作系统是 Windows配置与 Linux 几乎一致只是采集后端换成 DirectShowdshowpaths: cam: runOnInit: ffmpeg -f dshow -i videoUSB2.0 HD UVC WebCam -c:v libx264 -pix_fmt yuv420p -preset ultrafast -b:v 600k -f rtsp rtsp://localhost:$RTSP_PORT/$MTX_PATH runOnInitRestart: yes其中USB2.0 HD UVC WebCam是摄像头的设备显示名称而不是文件路径因此必须用双引号包裹。Windows 下摄像头名称并不固定需要先用 ffmpeg 的设备枚举命令查出本机实际设备名ffmpeg -list_devices true -f dshow -i dummy该命令会列出所有 DirectShow 设备输出形如[dshow ...] DirectShow video devices (some may be both video and audio devices) [dshow ...] USB2.0 HD UVC WebCam [dshow ...] HD Camera从中挑选你的摄像头名称填入配置即可。若还需同时采集麦克风音频可用-f dshow -i video设备名:audio麦克风名的形式同时指定音视频输入推流命令尾部再补充-c:a aac之类的音频编码参数。环境变量RTSP_PORT 与 MTX_PATH 从哪来上述命令中的$RTSP_PORT与$MTX_PATH不是 shell 环境变量而是 MediaMTX 在启动外部命令时注入的专用变量。它们的注入逻辑位于 internal/core/path.go 的ExternalCmdEnvfunc (pa *path) ExternalCmdEnv() externalcmd.Environment { _, port, _ : net.SplitHostPort(pa.rtspAddress) env : externalcmd.Environment{ MTX_PATH: pa.name, RTSP_PATH: pa.name, // deprecated RTSP_PORT: port, } ... }可见MTX_PATH当前路径名即cam确保 ffmpeg 推流的目标路径与配置的路径一致即使路径改名也无需改动命令。RTSP_PORTRTSP 服务器的实际监听端口。默认情况下 RTSP 监听在:8554见 internal/conf/conf.go 中RTSPAddress的默认值因此命令等价于推流到rtsp://localhost:8554/cam。使用变量而非硬编码端口可以保证你修改了rtspAddress后推流目标依然正确。若路径名是正则表达式还会额外注入G1、G2… 对应正则捕获组更多环境变量如MTX_QUERY、MTX_SOURCE_TYPE的完整说明见 mediamtx.yml 中 Hooks 一节的注释。同时ffmpeg 之外的外部命令也可以依赖这些变量例如在runOnInit中启动sh -c echo $MTX_PATH $RTSP_PORT /tmp/cam.logMediaMTX 会先把变量展开再执行。runOnInit命令在服务器/路径关闭时会被以 SIGINT 终止因此无需担心残留 ffmpeg 进程。验证与消费如何确认摄像头流已上线启动 MediaMTX 后可先观察日志确认命令被拉起。由 internal/hooks/on_init.go 的实现可知runOnInit启动和退出时都会输出runOnInit command started/runOnInit command exited日志据此即可判断 ffmpeg 是否在正常推流以及崩溃后是否被runOnInitRestart自动重启。流上线后路径/cam即可被任意协议读取MediaMTX 会自动完成 RTSP → HLS/WebRTC/RTMP/SRT 等协议的转码与分发用 VLC 等播放器直接播放rtsp://localhost:8554/cam远端机器把localhost换成服务器 IP具体命令参见 docs/4-read/10-vlc.md用 ffmpeg 拉流验证ffmpeg -i rtsp://localhost:8554/cam -frames:v 1 out.jpg在浏览器中通过 WebRTC 或 HLS 观看接入方式见 docs/4-read/03-webrtc.md 与 docs/4-read/06-hls.md。进阶变体多摄像头、录制与其他协议以/cam配置为模板可以自由扩展多路摄像头在paths下增加cam2条目命令中把/dev/video0或 Windows 设备名换成第二台设备$MTX_PATH会自动展开为cam2调整画质把-b:v 600k改为更大码率如-b:v 2M或追加-s 1280x720 -r 30固定分辨率与帧率开启录制在cam条目下添加record: yes即可把摄像头流录制为文件录制参数如recordPath、recordFormat在 mediamtx.yml 中有完整默认值说明转发到其他服务器添加forward: rtsp://other-server/$MTX_PATH将本机摄像头流转发给远端服务器参见 docs/2-features/11-forward.md。如果想了解runOnInit与按需启动钩子runOnDemand有读者请求时才拉起摄像头的区别以及全部路径配置参数的说明可参考 docs/2-features/14-on-demand-publishing.md 与配置参考文档 docs/5-references/1-configuration-file.md。【免费下载链接】mediamtxReady-to-use Media-over-QUIC / SRT / WebRTC / RTSP / RTMP / LL-HLS / MPEG-TS / RTP live media server and media proxy that allows to read, publish, proxy, record and playback real-time video and audio streams.项目地址: https://gitcode.com/GitHub_Trending/me/mediamtx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考