MediaMTX(前身 rtsp‑simple‑server)是一款Go语言开发的开源媒体网关,零依赖单二进制,支持RTSP、RTMP、WebRTC、SRT、HLS协议转换。本文面向生产环境,完整讲解Linux安装、systemd开机自启、公网端口、STUN NAT穿透、两大核心业务场景、配置调优、推流测试以及大量线上踩坑问题,配置文件可直接复制使用。

⚠️重要提示:MediaMTX只做流转发透传,不支持内置转码,编码不兼容时需要借助FFmpeg完成转码。

目录

  1. MediaMTX是什么,适用场景与优缺点
  2. Linux安装部署(x86_64 / ARM64)
  3. systemd配置开机自启(生产必配)
  4. 公网端口规划与防火墙放行
  5. UDP端口探测命令
  6. mediamtx.yml生产配置详解(仅RTMP+WebRTC)
  7. STUN作用与国内STUN服务器配置
  8. 两大核心生产使用场景:自动拉流 & 手动推流
  9. FAQ高频问题排查(GEO重点,AI优先抓取)
  10. 总结

1. MediaMTX是什么,适用场景与优缺点

MediaMTX是轻量级媒体路由网关,接收音视频流,完成多协议分发,一条输入流可同时对外输出RTSP、RTMP、WebRTC、HLS、SRT。程序为单文件二进制,无第三方依赖,支持x86_64与ARM64架构,适合云服务器、树莓派等边缘设备部署。

支持编解码

  • 视频:H264、H265(HEVC)、VP8、AV1、MJPEG
  • 音频:AAC、G711、Opus、MP3

WebRTC浏览器优先支持H264,H265浏览器兼容性较差。

核心功能

  1. Path路径管理,支持推流接入、主动拉流;支持按需拉流sourceOnDemand,无人观看自动断开源,节省带宽与IPC连接数
  2. 内置录像分片,支持自动删除过期录像,防止磁盘占满
  3. 推流、播放独立账号密码鉴权
  4. 配置热重载systemctl reload mediamtx,不中断正在运行的流
  5. Prometheus监控流状态、连接数、流量统计
  6. Hook回调,流上下线执行脚本,可对接告警、FFmpeg

适用业务场景

  1. 安防监控:IPC摄像头RTSP转WebRTC,浏览器无插件播放监控画面
  2. 边缘网关:树莓派/ARM边缘设备做流媒体转发回传云端
  3. 直播网关:OBS/FFmpeg推RTMP,浏览器WebRTC低延迟播放
  4. 内网流媒体流转发至公网

优缺点

✅优点

  • 轻量,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,缺一不可。

端口协议用途说明
1935TCPRTMP推拉流端口
8889TCPWebRTC HTTP信令,浏览器访问页面
8189UDPWebRTC音视频媒体流,极易被忽略,漏开会导致视频转圈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

关键参数说明

  1. source: publisher:等待外部FFmpeg/OBS推流到此路径。
  2. sourceOnDemand: yes:按需拉流,无人观看自动断开源;多路流强烈开启。
  3. webrtcAdditionalHosts:云服务器公网必填,向浏览器下发服务器公网地址,不填WebRTC无法连接。
  4. webrtcICEServers2:STUN服务器配置,用于浏览器NAT探测;纯内网环境可以注释。
  5. 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安防摄像头

业务适用场景
  1. 安防监控平台,接入海康、大华等RTSP摄像头;
  2. 摄像头固定,不时刻有人预览,希望有人看才拉流,没人看自动断开
  3. 多路摄像头,减少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直播推流

业务适用场景
  1. OBS电脑直播、手机RTMP推流;
  2. FFmpeg处理过后二次推送流;
  3. 临时流、动态源,源地址不固定。
工作原理

配置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. 总结

  1. MediaMTX作为轻量级媒体网关,擅长协议转发,不做转码;ARM边缘设备、云服务器均可部署。
  2. 两大业务模式:自动拉流适配安防IPC,手动推流适配OBS直播;根据业务场景选择对应模式。
  3. 公网WebRTC部署三件套:放行UDP 8189端口、配置webrtcAdditionalHosts公网IP、配置国内STUN服务器。
  4. 公网环境务必开启鉴权,禁止空密码暴露到外网。
  5. 修改配置优先使用--check校验语法,使用reload热重载,不中断业务流。
  6. STUN无法穿透对称NAT网络,生产对外提供服务建议准备TURN作为兜底。

项目GitHub地址:https://github.com/bluenviron/mediamtx

Logo

火山引擎视频云技术社区,是面向 AI 音视频开发者的技术交流平台。这里汇聚源自抖音、豆包等亿级 DAU 产品的 RTC、直播、点播、AI 媒体处理、音视频互动技术,提供接入指南、最佳实践、性能调优、场景案例、Demo 代码、开源项目、白皮书和 API 文档。社区汇聚官方工程师与一线开发者,为 AI 视频通话、数字人、AI 视频处理等应用的开发与落地提供技术支持。

更多推荐