一、项目背景与效果
项目需要在浏览器端实时观看香橙派摄像头的画面。之前使用ffmpeg 推 RTMP 流 + ffplay 拉流的方案,在局域网内端到端延时高达5~8 秒,完全无法用于实时遥控或监控。
切换到MediaMTX的 WebRTC 播放后,实测端到端延时稳定在 500-800ms,比 ffmpeg 拉流方式快了近10 倍,肉眼几乎感觉不到延迟。本文将完整记录安装、配置、设置开机自启的全过程,以及两个典型踩坑的排查与修复。
最终效果
- 浏览器访问
http://板子IP:8889/live/stream0即可看到超低延迟视频 - 板子重启后服务自动运行,无需手动干预
二、环境信息
- 硬件:Orange Pi 5 Ultra(ARM64,aarch64)
- 系统:Armbian / Ubuntu 22.04(root 用户)
- 软件:MediaMTX v1.8.3 官方预编译版
- 推流方式:板端应用通过 RTMP 推至本机
rtmp://127.0.0.1:1935/live/stream0 - 播放方式:浏览器通过 WebRTC 拉流
三、MediaMTX 安装(极简)
MediaMTX 为 ARM64 提供了静态二进制,无需编译,直接下载解压即可。
# 确认架构(必须输出 aarch64)uname-m# 下载 1.8.3 版本(请至 GitHub Releases 确认最新版)wgethttps://github.com/bluenviron/mediamtx/releases/download/v1.8.3/mediamtx_v1.8.3_linux_arm64v8.tar.gz# 解压,得到 mediamtx(可执行文件)和 mediamtx.yml(默认配置)tar-xzfmediamtx_v1.8.3_linux_arm64v8.tar.gz为了方便管理并避免后续权限问题,推荐将可执行文件复制到标准路径:
sudocpmediamtx /usr/local/bin/sudochmod+x /usr/local/bin/mediamtx四、配置文件(低延时的关键)
WebRTC 的低延迟优势必须搭配正确的配置才能发挥。这里我们关闭无关协议,只保留 RTMP 和 WebRTC。
创建配置文件(路径可自定,本例使用/usr/local/etc/mediamtx.yml):
sudomkdir-p/usr/local/etcsudonano/usr/local/etc/mediamtx.yml写入以下内容(注意替换webrtcAdditionalHosts为板子实际 IP):
logLevel:infortmp:yesrtmpAddress::1935webrtc:yeswebrtcAddress::8889webrtcAllowOrigin:'*'webrtcLocalUDPAddress::8189webrtcLocalTCPAddress::8188webrtcIPsFromInterfaces:nowebrtcAdditionalHosts:[192.168.137.6]# 请替换为板子实际 IPrtsp:nohls:nosrt:nopaths:live/stream9:source:publisheroverridePublisher:nolive/stream11:source:publisheroverridePublisher:nolive/stream0:source:publisheroverridePublisher:no配置说明:
- 仅开启 RTMP 推流和 WebRTC 播放,降低资源占用。
webrtcAdditionalHosts必须填写板子在局域网中的实际 IP,否则浏览器无法获取 ICE 候选,导致连接失败。- 如果你的场景需要 WebRTC 通过 STUN/TURN 跨网络,还请额外添加相应配置。
五、设置 systemd 开机自启
为了让服务在板子启动后自动运行,我们编写 systemd 单元文件。
sudonano/etc/systemd/system/mediamtx.service内容如下:
[Unit] Description=MediaMTX streaming server After=network.target [Service] Type=simple ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml Restart=on-failure RestartSec=5 User=root [Install] WantedBy=multi-user.target然后执行:
sudosystemctl daemon-reloadsudosystemctlenablemediamtxsudosystemctl start mediamtx验证服务状态:
systemctl status mediamtx应显示active (running),否则需根据错误信息排查(下一节即为典型错误)。
检查端口监听:
ss-lntup|grep-E'1935|8889'ss-lunp|grep8189正常情况下可看到 RTMP (1935)、WebRTC TCP (8889) 和 UDP (8189) 端口均在监听。
六、踩坑一:status=200/CHDIR错误导致服务无法启动
现象systemctl status mediamtx显示:
Active: activating (auto-restart) (Result: exit-code) Process: 1234 ExecStart=/usr/local/bin/mediamtx /root/mediamtx/mediamtx.yml (code=exited, status=200/CHDIR)原因CHDIR表示进程尝试切换工作目录失败。这里的错误在于ExecStart中配置文件路径/root/mediamtx/mediamtx.yml的父目录/root/mediamtx不存在或不是目录。
常见情况:之前不小心把解压出的mediamtx二进制直接放在了/root/下并命名为mediamtx,导致/root/mediamtx是一个文件而非目录,服务自然会失败。
解决办法
统一文件路径,确保二进制与配置文件路径都正确存在。我们的推荐已经将二进制放在/usr/local/bin/mediamtx,配置文件放在/usr/local/etc/mediamtx.yml。只要ExecStart写为:
ExecStart=/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml就不会再出现CHDIR。如果你的历史文件比较混乱,请先运行以下命令确认实际位置:
whichmediamtx# 查看二进制位置ls-l/usr/local/etc/# 查看配置文件是否存在然后修正服务文件并systemctl daemon-reload重启。
七、踩坑二:修改了配置文件但 WebRTC 端口不生效
现象
已经确认mediamtx.yml中webrtc: yes,并重启了服务,但ss -lntup只能看到 1935 端口,8889 端口始终不存在。
原因
MediaMTX 加载的配置文件可能并不是你编辑的那一个。可以通过以下命令查看实际运行参数:
psaux|grepmediamtx# 或cat/proc/$(pidof mediamtx)/cmdline|tr'\0'' '你会看到类似/usr/local/bin/mediamtx /usr/local/etc/mediamtx.yml的输出。如果这里显示的配置文件路径与你编辑的不一致,比如你编辑的是/root/mediamtx/mediamtx.yml,但进程加载的是/usr/local/etc/mediamtx.yml,自然修改无法生效。
解决办法
保持 systemd 服务文件中的配置文件路径与你实际修改的文件一致。修改后务必执行:
sudosystemctl daemon-reloadsudosystemctl restart mediamtx之后再次检查端口,8889 应该就会出现。
八、验证开机自启的常用命令
# 查看是否已设置为开机启动systemctl is-enabled mediamtx# 输出 enabled 即成功# 在所有服务列表中查找systemctl list-unit-files--type=service|grepmediamtx# 最可靠的验证方法:直接重启板子sudoreboot# 重启后立即连接,查看服务状态systemctl status mediamtx九、延时实测:比 ffmpeg 拉流快近 10 倍
部署完成后,在同一局域网内:
- ffmpeg 拉流方式:
ffplay rtmp://板子IP/live/stream0,画面比实际动作延迟 5~8 秒 - MediaMTX WebRTC 方式:Chrome 浏览器访问
http://192.168.137.6:8889/live/stream0,用手机秒表同框测试,延时稳定在 500-800ms,通常仅 600ms 左右
近 10 倍的延时缩减,使得远程监控、机器人遥控等场景真正变得可用。
注:实际延时受网络环境、编码器参数等影响,本文数据基于 H.264 编码、720P 分辨率,局域网有线连接。
十、经验萃取(下次直接套用)
| 问题场景 | 核心教训 | 快速排查方法 |
|---|---|---|
服务启动失败CHDIR | ExecStart中配置文件路径的父目录必须是一个真实存在的目录,不能是文件;建议统一将配置放在/usr/local/etc/ | ls -ld /配置文件父目录路径 |
| 修改配置不生效 | 用ps或/proc/PID/cmdline确认进程实际加载的配置文件路径,不要想当然 | `ps aux |
| 隐藏文件通过 scp 复制失败 | 隐藏文件(以.开头)不会自动补全,容易打错名字;先用ls -a确认 | ls -a 源目录 |
| WebRTC 端口不监听 | 确认配置文件中webrtc: yes且进程确实使用了该文件;还需检查防火墙是否放行 8889 和 8189 | `ss -lntup |
| 忘记放行防火墙 | 如果端口已监听但外部无法访问,可能是防火墙拦截 | sudo ufw allow 8889/tcp等 |
十一、总结
在 Orange Pi 5 Ultra 这样的小型 ARM 板子上,利用 MediaMTX 可以轻松搭建超低延时的 WebRTC 流媒体服务。整个过程只需下载一个二进制、写一份配置文件、建一个 systemd 服务。尽管过程中可能会遇到CHDIR错误或配置不生效的坑,但只要搞清文件路径一致性和进程实际加载的配置这两个关键点,很快就能解决问题。
最终延时从 5~8 秒骤降至 500-800ms,比局域网 ffmpeg 拉流快了近 10 倍,为后续实时视频应用打下了坚实基础。
如果这篇踩坑记录对你有帮助,欢迎点赞、收藏、评论,一起交流 ARM 板上的实时音视频技术!