MediaMTX(原 SRS-MediaServer)是一款开源的跨平台流媒体服务器,支持 RTMP、RTSP、WebRTC、HLS、HTTP-FLV、SRT 等多种流媒体协议,广泛用于直播、视频会议、监控等场景。其核心功能之一是推流(Push)和拉流(Pull),即接收外部流媒体输入(推流)并转发到其他终端或存储(拉流)。以下从协议支持、配置方法、典型场景和常见问题四个维度详细解析 MediaMTX 的推拉流功能。
一、MediaMTX 推拉流的核心协议
MediaMTX 的推拉流能力依赖于对多种协议的支持,以下是关键协议的作用:
协议类型 | 推流(输入) | 拉流(输出) | 典型场景 |
---|---|---|---|
RTMP | 支持(接收外部 RTMP 推流) | 支持(输出 RTMP 流到播放器) | 传统直播(如 OBS 推流到 MediaMTX) |
SRT | 支持(低延迟推流,抗丢包) | 支持(低延迟拉流) | 专业直播、广电级传输 |
WebRTC | 支持(双向推拉流,低延迟) | 支持(双向拉流) | 实时互动(如视频会议、连麦) |
RTSP | 支持(接收 RTSP 摄像头推流) | 支持(输出 RTSP 流到其他设备) | 监控摄像头接入 |
HLS | 不直接支持(需转封装) | 支持(生成 HLS 切片供播放器拉取) | 点播/直播兼容(如网页端播放) |
HTTP-FLV | 不直接支持 | 支持(输出 HTTP-FLV 流) | 低延迟网页直播(兼容 Flash 播放器) |
二、推流(Push):接收外部流输入
推流是指将外部音视频流(如摄像头、编码器、OBS 等)发送到 MediaMTX 服务器。MediaMTX 支持通过 RTMP、SRT、WebRTC 等协议接收推流,并可进一步转发到其他协议(如 HLS、RTSP)。
1. 配置推流入口
MediaMTX 的核心配置文件是 mediaTX.yml
(默认路径 /usr/local/etc/mediamtx/mediaTX.yml
或当前目录)。需在 paths
字段下定义推流的路径(Path),指定协议和参数。
示例 1:配置 RTMP 推流入口
paths:
# RTMP 推流路径(默认路径为 /live/{stream})
live:
enabled: true # 启用该路径
runOnInit: # 可选:流创建时执行的脚本(如录制)
- ffmpeg -i rtmp://localhost/live/$STREAM -c copy /var/recording/$STREAM.mp4
publish: # 推流权限控制(允许匿名或认证)
auth: # 可选:启用认证(需配合 http-server)
- user: admin
password: 123456
- 说明:客户端通过
rtmp://<mediamtx-ip>:1935/live/stream_name
推流(默认 RTMP 端口为 1935)。
示例 2:配置 SRT 推流入口(低延迟)
paths:
srt_live:
enabled: true
protocol: srt # 指定协议为 SRT
listen: :1234 # 监听端口(默认 SRT 端口 1234)
mode: listener # 模式为监听(接收推流)
latency: 100 # 延迟控制(毫秒)
publish:
auth: # 认证(可选)
- user: srt_user
password: srt_pwd
- 说明:客户端通过
srt://<mediamtx-ip>:1234?streamid=live/stream_name
推流(需指定streamid
匹配路径)。
示例 3:配置 WebRTC 推流入口(双向互动)
paths:
webrtc_live:
enabled: true
protocol: webrtc # 协议为 WebRTC
iceServers: # STUN/TURN 服务器(解决 NAT 穿透)
- urls: "stun:stun.l.google.com:19302"
publish: # 推流权限(允许匿名)
auth: []
- 说明:客户端通过 WebRTC 的
MediaStream
接口推流(需配合前端 SDK,如 JavaScript 的getUserMedia
)。
2. 推流测试(以 FFmpeg 为例)
使用 FFmpeg 推送本地文件或实时采集流到 MediaMTX:
# 推送本地 MP4 文件(RTMP)
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost/live/test_stream
# 推送摄像头实时流(RTMP,Linux 下使用 v4l2)
ffmpeg -f v4l2 -i /dev/video0 -c:v libx264 -f flv rtmp://localhost/live/webcam
# 推送 SRT 流(需先启动 MediaMTX 的 SRT 路径)
ffmpeg -re -i input.mp4 -c copy -f mpegts srt://localhost:1234?streamid=live/srt_test
三、拉流(Pull):输出流到终端或其他系统
拉流是指从 MediaMTX 服务器获取流并输出到终端(如播放器、存储设备或其他流媒体服务器)。MediaMTX 支持通过 HLS、RTSP、HTTP-FLV、WebRTC 等协议输出拉流。
1. 配置拉流出路
在 mediaTX.yml
中定义拉流的路径(Path),指定输出协议和参数。拉流通常基于已有的推流路径(如从 RTMP 推流路径拉取并转为 HLS)。
示例 1:将 RTMP 推流转为 HLS 拉流
paths:
hls_live:
enabled: true
protocol: hls # 协议为 HLS
source: live # 源路径(来自 RTMP 推流的 live 路径)
hls:
segmentDuration: 2 # 分片时长(秒)
playlistDuration: 60 # 播放列表时长(秒)
removeDelay: 30 # 删除旧分片的延迟(秒)
- 说明:客户端通过
http://<mediamtx-ip>:8080/hls/live.m3u8
拉取 HLS 流(默认 HTTP 端口为 8080)。
示例 2:将 RTMP 推流转为 RTSP 拉流
paths:
rtsp_live:
enabled: true
protocol: rtsp # 协议为 RTSP
source: live # 源路径(来自 RTMP 推流的 live 路径)
runOnInit: # 启动时执行命令(可选,如转码)
- ffmpeg -i rtmp://localhost/live/$STREAM -c:v libx264 -c:a aac -f rtsp rtsp://localhost:8554/live/$STREAM
rtsp:
port: 8554 # RTSP 监听端口(默认 8554)
- 说明:客户端通过
rtsp://<mediamtx-ip>:8554/live/test_stream
拉取 RTSP 流。
示例 3:WebRTC 双向拉流(互动直播)
paths:
webrtc_live:
enabled: true
protocol: webrtc
iceServers: [ { "urls": "stun:stun.l.google.com:19302" } ]
# 允许从其他路径拉流(如 RTMP 转 WebRTC)
pull:
- from: live # 源路径(RTMP 推流路径)
mode: video # 拉取视频流
# 可选:音频流、数据流
- 说明:客户端通过 WebRTC 的
RTCPeerConnection
接口拉流(需配合前端 SDK 实现双向通信)。
2. 拉流测试(以播放器为例)
使用常见播放器验证拉流是否成功:
协议 | 播放地址示例 | 播放器 |
---|---|---|
HLS | http://localhost:8080/hls/live.m3u8 | VLC、Safari、FFmpeg(ffplay ) |
RTSP | rtsp://localhost:8554/live/test_stream | VLC、FFmpeg(ffplay ) |
HTTP-FLV | http://localhost:8080/flv/live/test_stream | VLC、flv.js(网页端) |
WebRTC | 需通过前端 SDK(如 JavaScript)连接 | Chrome、Firefox |
四、高级功能与优化
MediaMTX 支持推拉流的扩展功能,满足复杂场景需求:
1. 转码与转封装
通过 runOnInit
或独立进程调用 FFmpeg,在推拉流过程中进行转码(如 H.265 转 H.264)或转封装(如 RTMP 转 HLS):
paths:
transcoded_live:
enabled: true
protocol: hls
source: live
runOnInit:
- ffmpeg -i rtmp://localhost/live/$STREAM \
-c:v libx265 -crf 28 \ # 转码视频
-c:a aac -b:a 128k \ # 转码音频
-f hls -hls_time 2 \ # HLS 分片
/var/www/html/hls/$STREAM.m3u8
2. 录制与存储
推流时可通过 runOnInit
调用 FFmpeg 录制原始流到本地文件或云存储:
paths:
recorded_live:
enabled: true
protocol: rtsp
source: live
runOnInit:
- ffmpeg -i rtmp://localhost/live/$STREAM \
-c copy -f segment \ # 按时间分片
-segment_time 3600 \ # 每小时一个文件
/var/recordings/$STREAM_%Y%m%d_%H%M%S.mp4
3. 鉴权与安全
通过 auth
字段配置推拉流的认证,防止未授权访问:
paths:
protected_live:
enabled: true
protocol: rtsp
source: live
auth:
# RTSP 拉流鉴权(Basic Auth)
- type: basic
user: user1
password: pass123
# RTMP 推流鉴权(需配合 http-server 提供 token)
- type: token
token: "your_secure_token"
4. 低延迟优化
- SRT 推流:调整
latency
参数(默认 100ms,可降至 50ms)。 - WebRTC 推流:启用
iceTransportPolicy: relay
(强制使用 TURN 服务器减少延迟)。 - HLS 拉流:减小
segmentDuration
(如 1秒)和playlistDuration
(如 30秒)。
五、常见问题与解决
问题 1:推流失败(连接被拒绝)
- 原因:MediaMTX 未启用对应协议的端口(如 RTMP 默认 1935,SRT 默认 1234)。
- 解决:检查
mediaTX.yml
中listen
字段是否配置正确,或通过netstat
确认端口监听状态:netstat -tlnp | grep mediamtx
问题 2:拉流卡顿或延迟高
- 原因:网络带宽不足、转码参数过高(如分辨率过大)或缓存配置不合理。
- 解决:
- 降低推流分辨率或码率(如使用
-c:v libx264 -b:v 1M
)。 - 调整 HLS 分片时长(
segmentDuration: 1
)减少缓冲。
- 降低推流分辨率或码率(如使用
问题 3:WebRTC 推流无法穿透 NAT
- 原因:未配置 STUN/TURN 服务器或网络限制。
- 解决:
- 在
webrtc_live
路径中添加可靠的 STUN 服务器(如stun.l.google.com:19302
)。 - 若企业网络限制 UDP,需部署 TURN 服务器(如
coturn
)并配置iceServers
。
- 在
问题 4:HLS 播放器无法加载分片
- 原因:HLS 分片路径错误或权限不足(如 Nginx 未配置静态文件访问)。
- 解决:
- 确保
hls
路径的http
监听端口(默认 8080)已启用,且分片文件存储路径(如/var/www/html/hls
)可被播放器访问。
- 确保
总结
MediaMTX 的推拉流功能通过灵活的协议支持和模块化配置,覆盖了从传统直播到实时互动的多种场景。核心步骤包括:
- 在
mediaTX.yml
中定义推流路径(接收外部流)和拉流路径(输出到终端); - 配置协议参数(如端口、认证、延迟);
- 结合 FFmpeg 或前端 SDK 实现转码、录制或双向通信;
- 优化低延迟和稳定性(如 SRT、WebRTC 穿透)。
通过合理配置,MediaMTX 可作为轻量级流媒体服务器,满足中小型直播、监控、视频会议等场景的需求。