MediaMTX 跨平台部署实战:从树莓派到生产环境的选型与落地
【免费下载链接】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 是一款支持 RTSP、RTMP、WebRTC、SRT、HLS、MPEG-TS、RTP 的多协议实时媒体服务器,可以把一路摄像头流同时分发给不同协议的客户端,也能做转发与录制。这篇指南按"先定场景、再选路径、最后落地"的顺序讲清 MediaMTX 跨平台部署的完整过程:先给你一张按使用场景划分的决策表,再讲与平台无关的通用要点,最后是 Linux、Windows、macOS 三平台速览、容器化方案、树莓派边缘部署和一组高频排障问答,看完就能在自己的环境里跑起来。
1. 先看场景,再选路径
选型的第一步不是操作系统,而是用途。按下面的表对号入座,后面各节再展开对应路径的细节。
| 场景 | 推荐部署路径 | 最低硬件 | 主要注意点 |
|---|---|---|---|
| 家庭监控(1~2 路摄像头) | Linux 服务器或树莓派 4/5 + 官方 Docker 镜像 | 双核 2GB RAM(树莓派 4 建议 4GB) | 摄像头只推流不取流时,用sourceOnDemand省带宽 |
| 办公室演示 / 培训 | Windows 10/11 直接运行mediamtx.exe | 四核 8GB | 程序目录避开中文与空格路径 |
| 中小生产环境(几十路并发) | Linux 裸机或 Docker 容器,systemd/容器编排保证自启 | 八核 16GB,千兆网卡 | 文件描述符上限要放开,UDP 缓冲按需调大 |
| 边缘设备 / 树莓派 | MediaMTX 树莓派 ARM 版(官方交叉编译) | 树莓派 4 以上,2GB RAM 起步 | 关闭用不到的协议,录制写外接存储 |
判断逻辑很简单:要长期对外服务就选 Linux(裸机或容器都行);只是临时用就 Windows/macOS 直接跑二进制;跑在树莓派上就用 ARM 构建版本。
2. 三个平台通用的要点
平台无关的事情只讲一次:端口、配置结构、服务化。
2.1 端口规划
默认开启的监听端口如下,规划防火墙规则时直接照着开即可;rtpAddress是一个端口范围(默认 8000/8001 起,随并发增长),不是单一端口。
| 用途 | 默认端口 | 协议 |
|---|---|---|
| RTSP 接入 | 8554 | TCP |
| RTMP 接入 | 1935 | TCP |
| HLS 分发 | 8888 | TCP/HTTP |
| WebRTC 信令 | 8889 | TCP/HTTP |
| WebRTC 媒体(ICE) | 8189 | UDP |
| SRT 接入 | 8890 | UDP |
| 管理 API | 9997(默认关闭) | TCP/HTTP |
| Prometheus 指标 | 9998(默认关闭) | TCP/HTTP |
WebRTC 低延迟场景尤其注意 8889 和 8189 要同时放通,缺一个 UDP 端口信令能通、媒体建立不了。
2.2 配置文件骨架
配置文件就两部分:pathDefaults是所有流的默认值,paths下每个 key 是一路流(路径名)的覆盖项。完整参数清单带注释的模板在仓库根目录的mediamtx.yml,新建配置时建议从它裁剪,而不是从零写。
pathDefaults: source: publisher # 流由客户端推入;也可改成 rtsp://... 由服务端拉取 record: false paths: cam1: source: rtsp://user:pass@192.168.1.50:554/stream sourceOnDemand: yes record: yes上面这段把cam1配成"有人看才去拉、并录制",source写错地址时流会一直处于离线状态,但服务本身不报错,要查日志定位。
2.3 环境变量覆盖与参数命名
MediaMTX 支持用MTX_前缀的环境变量覆盖任意参数:参数名转大写,嵌套用_连接。比如把拉流源换成测试流,不用改配置文件:
MTX_PATHS_TEST_SOURCE=rtsp://myurl ./mediamtx容器部署时这是最顺手的注入方式——镜像不动,配置全走环境变量和挂载。
2.4 服务化:自启动 + 崩溃重启
思路统一:用平台的原生服务机制注册一个"跑mediamtx 配置文件"的进程,并开启失败自动重启。Linux 用 systemd,这是生产部署的标准动作,单元文件核心就是启动命令、文件描述符上限和重启策略:
[Service] User=mediamtx WorkingDirectory=/opt/mediamtx ExecStart=/opt/mediamtx/mediamtx /opt/mediamtx/mediamtx.yml Restart=always RestartSec=5 LimitNOFILE=100000并发高的场景LimitNOFILE=100000不是可选项,默认值下几百个连接就会撞上文件描述符上限。Windows 下用 NSSM 做同样的事,macOS 用 launchd,思路完全一致:注册、自启、崩溃拉起。
3. 平台速览
3.1 Linux:生产环境的主力
结论:功能全、性能稳,树莓派摄像头源也只在这里可用,生产部署首选。
- 发布版是静态编译的单二进制,解压即可运行,没有运行时依赖;自己从源码编译用
make build或make static。 - systemd 注册服务 +
Restart=always是标配(见 2.4 节)。 - UDP 收发量大时,按实际并发调大
udpReadBufferSize,能直接降低丢包。 - 多路并发建议同时放开系统层面的
nofile限制,而不只改 systemd 单元。
最小可用配置示例:
rtsp: true rtmp: true webrtc: true paths: ipcam: source: rtsp://192.168.1.100:554/stream sourceOnDemand: yes3.2 Windows:演示与桌面集成够用
结论:单文件即用,适合临时演示和办公内网;不建议跑长期高并发生产服务。
- 解压发布包得到
mediamtx.exe和mediamtx.yml,当前目录运行即可。 - 专属坑:程序与配置文件所在路径不要包含中文和空格,否则服务化注册和日志落盘都可能出问题,出现异常时先挪目录再查配置。
- 注册为 Windows 服务推荐 NSSM:
nssm install MediaMTX "C:\mediamtx\mediamtx.exe" "C:\mediamtx\mediamtx.yml"。 - 需要 FFmpeg 当拉流源时,把 ffmpeg 装进 PATH,
runOnInit里的命令才不会找不到可执行文件。
paths: webcam: source: udp+mpegts://:5004 rtsp: true webrtc: true这里用 MPEG-TS/UDP 收流是为了绕开"Windows 上没有现成摄像头源"的问题:让 FFmpeg 或摄像头推 UDP 5004 端口,MediaMTX 负责协议转换。
3.3 macOS:开发机首选
结论:适合本地开发和联调,摄像头权限是主要门槛。
- 发布包区分 Apple Silicon 与 Intel,下错架构装不上或跑不满性能。
- 专属坑:摄像头访问要在"系统设置 → 隐私与安全性 → 摄像头"里给终端/相关应用授权,MediaMTX 本身不会弹出授权框,表现为推流端黑屏或无流。
- 开机自启用 launchd 配置
KeepAlive,效果等同 systemd 的Restart=always。 - 局域网调试时注意系统防火墙首次运行会弹框,允许入站连接,否则 WebRTC 对端永远连不上。
4. 容器化:生产部署的默认选项
结论:跨平台一致性最好、回滚最省事,MediaMTX Docker 部署应作为生产环境的默认路径,而不是"退而求其次"。
官方镜像bluenviron/mediamtx:1基于scratch构建,内置 linux/amd64、armv6/v7/arm64 四个架构的二进制,docker run时自动按宿主机架构选包,同一份 Compose 从 x86 服务器到树莓派都能跑。
容器内约定:二进制在/mediamtx,默认配置文件路径也是/mediamtx.yml,挂载时对着放即可。一条命令先验证环境:
docker run --rm -it --network=host bluenviron/mediamtx:1起来后 9997 端口(若开启 API)和日志应正常,然后关掉它,换成下面的 Compose 方式常驻。生产环境的完整写法:
services: mediamtx: image: bluenviron/mediamtx:1 restart: unless-stopped ports: - "8554:8554" # RTSP - "1935:1935" # RTMP - "8888:8888" # HLS - "8889:8889" # WebRTC 信令 - "8189:8189/udp" # WebRTC 媒体 volumes: - ./mediamtx.yml:/mediamtx.yml - ./recordings:/mediamtx/recordings environment: MTX_LOGLEVEL: info注意8189必须声明/udp,漏了这条 WebRTC 媒体就建不起来,症状是浏览器能打开页面但黑屏。录制目录建议挂到宿主机固定路径,容器重建不丢文件。
4.1 补充:树莓派等边缘设备
结论:MediaMTX 树莓派部署走 ARM 交叉编译或官方 arm64 镜像,核心动作是"砍功能 + 外置存储"。
- 构建:仓库里
make build_armv7(32 位系统)或make build_arm64,产物是单二进制,拷上去就能跑;也可以直接用官方 arm64 镜像。 - 只留需要的协议:把
rtmp、srt、moq等设为false,省下监听端口和少量内存。 - 摄像头直接接树莓派时用内置源,配置比拉流简单:
paths: camera: source: rpiCamera rpiCameraWidth: 1280 rpiCameraHeight: 720 rpiCameraFPS: 25 record: yes recordPath: /media/usb/recordings/%pathrecordPath指向外接 USB 盘:SD 卡的写入寿命扛不住持续录制。日志级别降为warn、关掉api/metrics能再省一点开销。
5. 高频问题排障
每条按"症状 → 先查什么 → 怎么处理"展开,覆盖部署中最常遇到的几类。
- 启动报端口被占用。先查 8554/1935/8889 谁在用(Linux 用
sudo lsof -i :8554,Windows 用netstat -ano | findstr 8554)。是另一个 MediaMTX 实例就杀掉,是别的软件就在配置文件里改掉对应*Address。 - WebRTC 客户端一直转圈建连。先查 8189/UDP 是否放通、服务器是否有公网可达 IP;NAT 后面无法直达时,在
webrtcICEServers2里配置 STUN 或 TURN。 source指向的拉流源一直离线。先确认 URL 能被人肉拉下来(用 VLC 验证账号密码和地址);自签名证书的场景要填sourceFingerprint,否则 TLS 校验会静默失败。- Windows 下服务注册成功但起不来。九成是路径问题:把程序挪到无中文、无空格的目录(如
C:\mediamtx),再看服务日志定位真实错误。 - macOS 摄像头有画面但流是黑的。去系统设置里给终端应用开摄像头权限后重启进程;再确认 FFmpeg 取流参数与设备编号匹配。
- 并发升高后 UDP 丢包。查
dmesg/系统日志里有没有 socket 缓冲区溢出告警,调大udpReadBufferSize,同时确认writeQueueSize与内存余量是否匹配(该参数决定每个连接的待发队列长度)。 - 管理 API 打不开。默认
api: false是关着的,先确认配置里打开了、9997 端口可达;另外默认只有本机 IP 能访问 api/metrics,远程访问要先在authInternalUsers里授权。
6. 部署后动作与选型收束
选型三句话:长期对外服务选 Linux 裸机或容器;临时演示选 Windows 或 macOS 直接跑二进制;跑在树莓派上就用 ARM 构建版本,并砍掉用不到的协议。
四条收尾清单:
- 安全:对外端口启用对应协议的 TLS(如
webrtcEncryption、rtspEncryption),API 与 metrics 只暴露给内网或加认证,authInternalUsers里按最小权限配置。 - 监控:开启
metrics: true,用 Prometheus 抓取 9998 端口的连接数与字节速率,日志落文件便于回溯。 - 性能:按并发调
udpReadBufferSize、writeQueueSize和系统文件描述符上限,这三个是调优的第一梯队。 - 版本:配置备份后升级,升级前浏览仓库内的 release notes 与安装文档 确认有无破坏性变更;MediaMTX 的参数偶尔重命名,旧配置直接沿用可能静默失效。
延伸阅读(仓库内路径):
- 带完整注释的配置参考:mediamtx.yml
- 配置机制与环境变量说明:docs/2-features/05-configuration.md
- 功能总览目录:docs/2-features/
【免费下载链接】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),仅供参考