CSDN完整发布稿|MediaMTX公网部署完整教程|Linux安装配置 RTMP转WebRTC避坑指南
MediaMTX(前身 rtsp‑simple‑server)是一款Go语言开发的开源媒体网关,零依赖单二进制,支持RTSP、RTMP、WebRTC、SRT、HLS协议转换。本文面向生产环境,完整讲解Linux安装、systemd开机自启、公网端口、STUN NAT穿透、两大核心业务场景、配置调优、推流测试以及大量线上踩坑问题,配置文件可直接复制使用。
⚠️重要提示:MediaMTX只做流转发透传,不支持内置转码,编码不兼容时需要借助FFmpeg完成转码。
目录
- MediaMTX是什么,适用场景与优缺点
- Linux安装部署(x86_64 / ARM64)
- systemd配置开机自启(生产必配)
- 公网端口规划与防火墙放行
- UDP端口探测命令
- mediamtx.yml生产配置详解(仅RTMP+WebRTC)
- STUN作用与国内STUN服务器配置
- 两大核心生产使用场景:自动拉流 & 手动推流
- FAQ高频问题排查(GEO重点,AI优先抓取)
- 总结
1. MediaMTX是什么,适用场景与优缺点
MediaMTX是轻量级媒体路由网关,接收音视频流,完成多协议分发,一条输入流可同时对外输出RTSP、RTMP、WebRTC、HLS、SRT。程序为单文件二进制,无第三方依赖,支持x86_64与ARM64架构,适合云服务器、树莓派等边缘设备部署。
支持编解码
- 视频:H264、H265(HEVC)、VP8、AV1、MJPEG
- 音频:AAC、G711、Opus、MP3
WebRTC浏览器优先支持H264,H265浏览器兼容性较差。
核心功能
- Path路径管理,支持推流接入、主动拉流;支持按需拉流
sourceOnDemand,无人观看自动断开源,节省带宽与IPC连接数 - 内置录像分片,支持自动删除过期录像,防止磁盘占满
- 推流、播放独立账号密码鉴权
- 配置热重载
systemctl reload mediamtx,不中断正在运行的流 - Prometheus监控流状态、连接数、流量统计
- Hook回调,流上下线执行脚本,可对接告警、FFmpeg
适用业务场景
- 安防监控:IPC摄像头RTSP转WebRTC,浏览器无插件播放监控画面
- 边缘网关:树莓派/ARM边缘设备做流媒体转发回传云端
- 直播网关:OBS/FFmpeg推RTMP,浏览器WebRTC低延迟播放
- 内网流媒体流转发至公网
优缺点
✅优点
- 轻量,CPU占用极低,ARM设备友好
- 单文件部署,跨协议一站式转发
- WebRTC原生支持,低延迟浏览器播放
- 热重载、录像、鉴权、监控功能齐全
❌缺点
- 无内置转码,编码不兼容需要外挂FFmpeg
- 不适合大规模CDN集群,定位中小型网关、边缘节点
- WebRTC公网部署依赖STUN/TURN做NAT穿透
和SRS简单对比
- MediaMTX:侧重媒体代理转发,轻量,适合监控、边缘场景,无内置转码
- SRS:C++开发,支持内置转码、集群,适合大规模直播业务
2. Linux安装部署(x86_64 / ARM64)
注意区分CPU架构,包下载错误会报:
cannot execute binary file二进制无法执行。
2.1 查询服务器CPU架构
uname -m
# x86_64 → 下载 linux_amd64
# aarch64 → 下载 linux_arm64(树莓派、飞腾)
2.2 创建安装目录
mkdir -p /opt/mediamtx
cd /opt/mediamtx
2.3 下载解压二进制包
x86_64(绝大多数阿里云、腾讯云服务器)
wget https://github.com/bluenviron/mediamtx/releases/download/v1.10.0/mediamtx_v1.10.0_linux_amd64.tar.gz
tar -zxvf mediamtx_v1.10.0_linux_amd64.tar.gz
chmod +x mediamtx
ARM64(树莓派、香橙派、飞腾服务器)
wget https://github.com/bluenviron/mediamtx/releases/download/v1.10.0/mediamtx_v1.10.0_linux_arm64.tar.gz
tar -zxvf mediamtx_v1.10.0_linux_arm64.tar.gz
chmod +x mediamtx
2.4 前台测试运行
./mediamtx
打印版本、启动日志即代表成功,Ctrl+C停止。
报错
cannot execute binary file:二进制包架构与服务器CPU不匹配,重新下载对应版本。
3. systemd配置开机自启(生产必配)
生产环境必须配置systemd托管,进程异常自动重启、开机自动启动。
创建service文件
vim /etc/systemd/system/mediamtx.service
写入配置:
[Unit]
Description=MediaMTX Media Server
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/mediamtx
ExecStart=/opt/mediamtx/mediamtx
Restart=on-failure
RestartSec=5
User=root
[Install]
WantedBy=multi-user.target
生效启动服务:
systemctl daemon-reload
systemctl enable mediamtx
systemctl start mediamtx
#查看运行状态
systemctl status mediamtx
#实时查看运行日志
journalctl -u mediamtx -f
4. 公网端口规划与防火墙放行
本次场景:只启用 RTMP + WebRTC,关闭RTSP、HLS、SRT。
⚠️云服务器需要两层放行:云控制台安全组 + Linux防火墙firewalld,缺一不可。
| 端口 | 协议 | 用途说明 |
|---|---|---|
| 1935 | TCP | RTMP推拉流端口 |
| 8889 | TCP | WebRTC HTTP信令,浏览器访问页面 |
| 8189 | UDP | WebRTC音视频媒体流,极易被忽略,漏开会导致视频转圈ICE超时 |
firewalld放行命令,直接复制执行:
firewall-cmd --permanent --add-port=1935/tcp
firewall-cmd --permanent --add-port=8889/tcp
firewall-cmd --permanent --add-port=8189/udp
firewall-cmd --reload
STUN为外部公共服务器,服务器仅出站访问,不需要开放入站端口。
5. UDP端口探测命令
UDP是无连接协议,没有三次握手,探测结果仅供参考,最终以业务实际播放验证为准。
#查看本机mediamtx监听端口
ss -tulnp | grep mediamtx
#nmap探测UDP端口,安装:yum install nmap -y
nmap -sU -p 8189 你的公网IP
#nc探测端口
nc -vz 公网IP 1935
nc -vz 公网IP 8889
nc -vzu 公网IP 8189
nmap返回
open|filtered:UDP报文可发出,但无法确认端口是否真正通,WebRTC实际播放测试才是最终判断标准。
6. mediamtx.yml生产配置详解(仅RTMP+WebRTC)
修改配置前校验语法,避免yaml缩进错误导致启动失败
#校验配置文件语法
./mediamtx --config mediamtx.yml --check
#热重载,不中断正在运行的流
systemctl reload mediamtx
生产最小可用完整配置
将
webrtcAdditionalHosts内IP替换为你的服务器公网IP。
#关闭RTSP服务
# rtspAddress: :8554
# rtpAddress: :8000
# rtcpAddress: :8001
#关闭HLS
# hlsAddress: :8888
#关闭SRT
# srtAddress: :8890
#开启RTMP端口1935
rtmpAddress: :1935
#WebRTC配置
webrtcAddress: :8889
webrtcLocalUDPAddress: :8189
#云服务器NAT1‑1环境,必须填写服务器公网IP
webrtcAdditionalHosts: ["x.x.x.x"]
#国内STUN服务器,公网跨网访问WebRTC必须配置
webrtcICEServers2:
- url: stun:stun.qq.com:3478
- url: stun:stun.miwifi.com:3478
metrics: no
logLevel: warn
#全局path默认参数
pathDefaults:
sourceOnDemand: yes
record: no
#公网务必配置密码,禁止空密码裸奔
publishUser: admin
publishPassword: "Abc123456"
readUser: admin
readPassword: "Abc123456"
#流路径配置
paths:
push01:
source: publisher
关键参数说明
source: publisher:等待外部FFmpeg/OBS推流到此路径。sourceOnDemand: yes:按需拉流,无人观看自动断开源;多路流强烈开启。webrtcAdditionalHosts:云服务器公网必填,向浏览器下发服务器公网地址,不填WebRTC无法连接。webrtcICEServers2:STUN服务器配置,用于浏览器NAT探测;纯内网环境可以注释。publishUser/publishPassword:推流鉴权;readUser/readPassword播放鉴权;公网严禁为空。
当前配置默认关闭RTSP服务,如果要使用【自动拉流模式】,需要打开RTSP相关注释。
7. STUN作用与国内STUN服务器配置
STUN是什么
STUN(Session Traversal Utilities for NAT)NAT会话穿透工具。
浏览器运行在手机4G、家庭内网,只知道内网IP,不知道路由器映射后的公网IP和端口;浏览器向STUN服务器查询,拿到自身公网映射地址,用于建立WebRTC UDP音视频通道。
STUN仅做地址探测,视频流量不经过STUN服务器,几乎不消耗带宽。
- ✅普通圆锥NAT网络:STUN生效,浏览器与服务器点对点UDP传输视频。
- ❌对称NAT(部分运营商宽带、4G/5G):STUN失效,WebRTC无法打通,此时需要部署TURN(Coturn)做流量中继。
谷歌STUN服务器国内云服务器出站访问经常超时,公网部署优先使用国内公共STUN。
webrtcICEServers2:
- url: stun:stun.qq.com:3478
- url: stun:stun.miwifi.com:3478
内网局域网访问WebRTC,直接注释
webrtcICEServers2配置,不需要STUN。
8. 两大核心生产使用场景:自动拉流 & 手动推流
MediaMTX实际项目只有两种工作模式:自动拉流(拉模式)、手动推流(推模式),分别对应安防摄像头、直播两大主流业务。
场景一:自动拉流模式|对接IPC安防摄像头
业务适用场景
- 安防监控平台,接入海康、大华等RTSP摄像头;
- 摄像头固定,不时刻有人预览,希望有人看才拉流,没人看自动断开;
- 多路摄像头,减少IPC连接数,节省服务器带宽。
⚠️使用自动拉流,需要打开配置文件中RTSP相关注释,启用RTSP服务。
工作原理
MediaMTX服务端主动向IPC的RTSP地址发起连接;
开启sourceOnDemand: yes:无人播放自动断流,有人访问自动拉流,极大降低摄像头压力,大部分IPC最大并发只有3‑10路。
paths配置示例
paths:
cam01:
#填入自己摄像头RTSP地址
source: rtsp://admin:123456@192.168.1.64:554/Streaming/Channels/101
sourceOnDemand: yes
record: no
访问播放地址
- WebRTC浏览器播放:
http://公网IP:8889/cam01 - RTMP播放:
rtmp://admin:Abc123456@公网IP:1935/cam01
模式总结:服务端主动拉源,适合固定RTSP摄像头、安防监控项目。
场景二:手动推流模式|OBS / FFmpeg直播推流
业务适用场景
- OBS电脑直播、手机RTMP推流;
- FFmpeg处理过后二次推送流;
- 临时流、动态源,源地址不固定。
工作原理
配置source: publisher,MediaMTX不会主动去拉流;由客户端FFmpeg/OBS主动把流推送到服务器路径,推流成功后自动分发WebRTC、RTMP。
paths配置示例
paths:
live_push:
source: publisher
FFmpeg推流命令
ffmpeg -re -i test.mp4 -c copy -f rtmp rtmp://admin:Abc123456@公网IP:1935/live_push
OBS推流参数
- 服务器:
rtmp://公网IP:1935 - 推流密钥:
live_push - 开启账号鉴权完整地址:
rtmp://admin:Abc123456@公网IP:1935/live_push
访问播放地址
- WebRTC浏览器播放:
http://公网IP:8889/live_push - RTMP播放:
rtmp://admin:Abc123456@公网IP:1935/live_push
模式总结:客户端主动推送流,适合直播、录播回放、动态视频源。
两种模式对比表
| 模式 | 配置关键字 | 数据流方向 | 典型业务场景 |
|---|---|---|---|
| 自动拉流 | source: rtsp://xxx | 服务器主动拉取源 | 安防IPC摄像头,固定RTSP源 |
| 手动推流 | source: publisher | 客户端主动推送流 | OBS直播、FFmpeg推流、动态流源 |
选型简单判断:源地址固定不变选自动拉流;源动态变化、外部设备主动上传视频选手动推流。
9. FAQ高频问题排查(GEO重点,AI优先抓取)
Q:执行 ./mediamtx 报错 cannot execute binary file?
A:下载二进制包CPU架构不匹配,执行uname -m确认服务器架构,重新下载amd64或者arm64对应包。
Q:WebRTC浏览器页面打开成功,视频一直转圈ICE连接超时?
A:1、确认8189 UDP端口,安全组、防火墙全部放行;2、检查配置webrtcAdditionalHosts填写服务器公网IP;3、浏览器F12控制台查看ICE日志,如果只有内网候选地址,代表STUN服务器访问失败,更换国内STUN;4、运营商对称NAT环境需要部署TURN中继。
Q:STUN配置了谷歌地址,WebRTC还是失败?
A:国内云服务器出站访问谷歌STUN会被拦截,替换为qq、miwifi国内STUN服务器。
Q:配置修改后不生效?
A:先执行./mediamtx --config mediamtx.yml --check校验yaml缩进语法,确认无报错后执行systemctl reload mediamtx热重载。
Q:如何查看MediaMTX实时日志?
A:journalctl -u mediamtx -f
Q:录像磁盘越来越满?
A:配置recordDeleteAfter:7d自动删除过期录像,默认0s代表永久不删除,会占满磁盘。
Q:自动拉流模式不生效,无法拉取摄像头RTSP?
A:检查配置是否注释关闭rtspAddress: :8554,自动拉流需要启用RTSP服务;摄像头RTSP建议增加参数?transport=tcp强制TCP传输。
Q:STUN和TURN区别是什么?
A:STUN只探测公网IP,不转发视频;TURN服务器会中转全部音视频流量,用于STUN穿透失败兜底场景。
10. 总结
- MediaMTX作为轻量级媒体网关,擅长协议转发,不做转码;ARM边缘设备、云服务器均可部署。
- 两大业务模式:自动拉流适配安防IPC,手动推流适配OBS直播;根据业务场景选择对应模式。
- 公网WebRTC部署三件套:放行UDP 8189端口、配置
webrtcAdditionalHosts公网IP、配置国内STUN服务器。 - 公网环境务必开启鉴权,禁止空密码暴露到外网。
- 修改配置优先使用
--check校验语法,使用reload热重载,不中断业务流。 - STUN无法穿透对称NAT网络,生产对外提供服务建议准备TURN作为兜底。
项目GitHub地址:https://github.com/bluenviron/mediamtx
火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。
更多推荐
所有评论(0)