MediaMTX(原 SRS-MediaServer)的推拉流详解

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. 拉流测试(以播放器为例)

使用常见播放器验证拉流是否成功:

协议播放地址示例播放器
HLShttp://localhost:8080/hls/live.m3u8VLC、Safari、FFmpeg(ffplay
RTSPrtsp://localhost:8554/live/test_streamVLC、FFmpeg(ffplay
HTTP-FLVhttp://localhost:8080/flv/live/test_streamVLC、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.ymllisten 字段是否配置正确,或通过 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 的推拉流功能通过灵活的协议支持和模块化配置,覆盖了从传统直播到实时互动的多种场景。核心步骤包括:

  1. mediaTX.yml 中定义推流路径(接收外部流)和拉流路径(输出到终端);
  2. 配置协议参数(如端口、认证、延迟);
  3. 结合 FFmpeg 或前端 SDK 实现转码、录制或双向通信;
  4. 优化低延迟和稳定性(如 SRT、WebRTC 穿透)。

通过合理配置,MediaMTX 可作为轻量级流媒体服务器,满足中小型直播、监控、视频会议等场景的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值