实战指南:协议原理、URL 构造与客户端接入)
MediaMTX SRT 拉流Read实战指南协议原理、URL 构造与客户端接入【免费下载链接】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/mediamtxMediaMTX 内置完整的 SRT 服务端实现支持通过srt://地址以 MPEG-TS 封装实时读取拉流已发布的直播流并提供加密、完整性校验与丢包重传机制。本文基于仓库文档 docs/4-read/02-srt.md 与源码实现系统讲解 SRT 拉流支持的编码格式、URL 与 Stream ID 语法含标准语法与自定义语法、可用的主流客户端接入方式并深入解析服务端读取链路的底层实现帮助读者从「能用」进阶到「懂原理」。概述为什么用 SRT 读流SRTSecure Reliable Transport是一种基于 UDP 的传输协议最初由 Haivision 提出并开源专为在不可靠的公网链路上传输实时媒体而设计。它在一套协议内同时提供了三大能力加密Encryption通过预共享密钥Passphrase对传输内容进行 AES 加密防止内容被窃听完整性Integrity对每个数据包做校验发现损坏的数据重传机制Retransmission接收端通过 NAKNegative Acknowledgment反馈丢包发送端自动重传丢失的数据包实现接近无损的传输。在 MediaMTX 中SRT 通常用于传输以MPEG-TS封装的媒体流。发布方将视频/音频流封装成 MPEG-TS 后经 SRT 推入服务端读取方再通过 SRT 以read动作向服务端请求该流服务端将流以 MPEG-TS 封装格式发送给读取方。由于 SRT 自带重传与抖动缓冲它特别适合跨公网、跨运营商这种丢包率较高的弱网场景是 RTSP、RTMP 之外一种重要的低延迟可靠读取手段。SRT 读取支持的编码格式通过 SRT 协议读取流时MediaMTX 支持的编码格式如下与发布侧一致见 docs/3-publish/03-srt-clients.md支持的编码videoH265、H264、MPEG-4 VideoH263、Xvid、MPEG-1/2 VideoaudioOpus、MPEG-4 AudioAAC、MPEG-1/2 AudioMP3、AC-3otherKLV可以看出覆盖了主流的 H.264/H.265 视频编码与 AAC/Opus/MP3/AC-3 音频编码此外还支持 KLVKey-Length-Value元数据流。这些编码在 SRT 读取链路上统一以 MPEG-TS 封装承载。构造 SRT 读取 URL要从 MediaMTX 服务端读取一个流使用如下格式的 URLsrt://localhost:8890?streamidread:mystream其中srt://localhost:8890服务端 SRT 监听地址。8890是 SRT 服务的默认端口可在全局配置项srtAddress中修改见 internal/conf/conf.go 与 internal/conf/conf.go默认值为:8890streamidread:mystream这是 MediaMTX 的自定义 Stream ID 语法read表示执行读取拉流动作mystream替换为实际的路径名Path Name。注意这里路径名必须与发布方推流时使用的路径一致且该路径当前必须处于已发布状态存在在线发布者。如果路径不存在或没有发布者读取请求会被服务端拒绝。带认证与参数的完整语法在自定义语法下Stream ID 除了action:pathname之外还支持携带用户名、密码与附加查询参数。完整的自定义语法格式为action:pathname[:query] action:pathname:user:pass[:query]例如srt://localhost:8890?streamidread:mystream:myuser:mypass:paramvalue其中read是动作mystream是路径myuser/mypass是用于认证的凭据paramvalue是附加查询信息会被原样传递给鉴权逻辑、hooks 等下游模块。如果省略用户名密码则只有action:pathname[:query]三/两段形式。从源码看internal/servers/srt/streamid.go 中自定义语法的解析逻辑如下按:将 Stream ID 拆分成 25 段超出该范围会报错第一段必须是read或publish否则解析失败pathname取自第二段当段数为 4 或 5 时第三、四段分别作为用户名和密码段数为 3 或 5 时末尾段作为 query 查询参数结尾的#feedbackplay后缀会被自动剥离以兼容部分 SRT 客户端如 VLC 某些版本自动附加的行为。使用标准 Stream ID 语法#!::部分硬件设备与客户端强制要求使用 SRT 协议作者提出的标准 Stream ID 语法Access Control 规范而不是 MediaMTX 的自定义语法。MediaMTX 同样兼容该语法见 docs/2-features/24-srt-specific-features.md示例如下srt://localhost:8890?streamid#!::mrequest,rmypath,umyuser,smypasspkt_size1316其中各键的含义为键含义取值示例m动作actionrequest读取/publish发布r路径pathmypathu用户名usernamemyusers密码passwordmypass读取动作使用mrequest而非read这是标准语法与自定义语法在动作命名上的关键差异。标准语法的解析实现位于 internal/servers/srt/streamid.goStream ID 以#!::前缀开头时进入标准语法分支按,分割键值对、按分割键与值其中u、r、h、s、t、m键被识别h与t当前会被忽略m只接受request与publish两个取值其余值返回unsupported mode错误。URL 末尾的pkt_size1316属于 SRT 传输层参数用于指定 SRT 数据包负载大小。使用 FFmpeg 读取FFmpeg 同时支持通过 RTSP、RTMP、HLS 与 SRT 协议从 MediaMTX 读流其中官方推荐的首选协议是 RTSP当需要跨公网弱网传输时可选用 SRT。FFmpeg 与 SRTffmpeg -i srt://localhost:8890?streamidread:mystream -c copy output.mp4要点-c copy表示不转码直接复制流读取后保存为本地文件URL 必须用单引号包裹因为?与等字符会被 Shell 解释若路径带认证信息URL 写成srt://localhost:8890?streamidread:mystream:myuser:mypass即可或使用标准语法#!::mrequest,rmystream,umyuser,smypass。FFmpeg 与 RTSP参考对比ffmpeg -i rtsp://localhost:8554/mystream -c copy output.mp4使用 GStreamer 读取GStreamer 支持通过 RTSP、RTMP、HLS、SRT 与 WebRTC 协议从 MediaMTX 读流。GStreamer 与 SRTgst-launch-1.0 srtsrc urisrt://localhost:8890?streamidread:mystream ! tsdemux ! decodebin ! autovideosink要点srtsrc是 GStreamer 的 SRT 源插件uri参数传入完整 URL由于 SRT 承载的是 MPEG-TS 封装需要tsdemux将 TS 解封装还原出视频/音频基本流decodebin自动选择合适的解码器autovideosink负责渲染显示同样地URL 中的?与需要用引号包裹此处使用了双引号。GStreamer 与 RTSP参考对比gst-launch-1.0 rtspsrc locationrtsp://127.0.0.1:8554/mystream latency0 ! decodebin ! autovideosink使用 VLC 读取VLC 支持通过 RTSP、RTMP、HLS 与 SRT 协议从 MediaMTX 读流。VLC 与 SRT在 VLC 中打开如下网络地址即可播放srt://localhost:8890?streamidread:mystream低延迟优化建议将 VLC 的Network caching参数调小步骤如下打开 VLC进入工具→首选项→显示设置→全部页面选择输入/编解码器找到网络缓存毫秒参数将其设置为50保存即可。减小网络缓存可以显著降低播放延迟代价是网络抖动时更容易出现卡顿实际取值需根据网络状况权衡。服务端读取链路源码解析理解客户端侧 URL 之后再深入服务端看读取请求是如何被处理的。相关实现位于 internal/servers/srt/server.go 与 internal/servers/srt/conn.go。监听与握手服务端在Initialize()中通过srt.Listen(srt, s.Address, conf)启动 UDP/SRT 监听internal/servers/srt/server.go并依据全局配置设定ConnectionTimeout、PeerIdleTimeout等超时参数。收到新的 SRT 连接请求srt.ConnRequest后每个连接由独立的conn协程处理处理的第一步就是解析 Stream ID 并分发动作internal/servers/srt/conn.govar streamID streamID err : streamID.unmarshal(c.connReq.StreamId()) if err ! nil { ... } if streamID.mode streamIDModePublish { return c.runPublish(streamID) } return c.runRead(streamID)也就是说read/request动作会进入runRead()走读取路径。读取动作处理流程runReadrunRead()internal/servers/srt/conn.go的主要步骤鉴权与路径查找调用pathManager.AddReader()把 Stream ID 中解析出的路径、query、用户名、密码以及客户端 IP 一并交给路径管理器做权限校验协议标识为auth.ProtocolSRT。认证失败或路径不存在时连接请求被connReq.Reject(srt.REJ_PEER)拒绝Passphrase 校验若该路径配置了srtReadPassphrase读取口令见 internal/conf/path.go则通过srtCheckPassphrase()要求客户端连接已加密且密钥正确internal/servers/srt/conn.go不满足则拒绝连接接受连接并封装 TS调用connReq.Accept()建立 SRT 会话然后通过mpegts.FromStream(res.Stream.OrigDesc, r, bw, sconn, writeTimeout)将服务端内部流格式实时封装为 MPEG-TS 并写入 SRT 连接internal/servers/srt/conn.go。缓冲区大小由srtMaxPayloadSize()计算((u - 16) / 188) * 188即扣除 16 字节 SRT 头后按 188 字节 MPEG-TS 包对齐internal/servers/srt/server.go注册读取者把该连接作为stream.Reader挂到流上此后每收到发布者的新数据帧就自动转发给该 SRT 读取者直至连接断开或上下文取消。整个过程对应仓库中的端到端测试 internal/servers/srt/server_test.go测试以srt://127.0.0.1:8890?streamidread:teststream:myuser:mypass:paramvalue发起读取验证了路径、query、用户名、密码的正确透传并确认读取者能收到封装为 H264 MPEG-TS 的数据帧。连接状态与监控每个 SRT 连接都会记录状态idle/publish/read、路径、query、用户等信息并可通过 API 查询apiItem()还通过sconn.Stats()采集大量 SRT 统计指标丢包、重传、RTT、发送/接收速率、往返时延、流量窗口等见 internal/servers/srt/conn.go这些指标会暴露给 metrics 与 Control API便于运维人员实时观察弱网下的传输质量。总结接入方式命令 / 操作FFmpegffmpeg -i srt://localhost:8890?streamidread:mystream -c copy output.mp4GStreamergst-launch-1.0 srtsrc urisrt://localhost:8890?streamidread:mystream ! tsdemux ! decodebin ! autovideosinkVLC打开srt://localhost:8890?streamidread:mystream建议调低网络缓存至 50ms核心要点回顾SRT 读取地址固定为srt://host:8890行为由streamid参数控制读取动作为自定义语法的read或标准语法的request支持携带用户名、密码与 query 参数也可使用硬件友好的标准#!::语法传输层为 MPEG-TS 封装支持 H.264/H.265、AAC/Opus/MP3/AC-3 与 KLV 等编码服务端内置加密 Passphrase 校验、鉴权、读取者管理与丰富的统计指标适合跨公网弱网的可靠低延迟拉流场景。更多相关阅读SRT 专属特性标准 Stream ID 语法、使用 SRT 客户端发布流、FFmpeg 读流、GStreamer 读流、VLC 读流。【免费下载链接】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),仅供参考