多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

MediaMTX 云部署实战:从 Docker 单容器到 Kubernetes 的流媒体服务器搭建

MediaMTX 云部署实战:从 Docker 单容器到 Kubernetes 的流媒体服务器搭建 MediaMTX 云部署实战从 Docker 单容器到 Kubernetes 的流媒体服务器搭建【免费下载链接】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 是一个零依赖的流媒体服务器一个二进制文件就内置了 RTSP、RTMP、HLS、WebRTC、SRT 五种协议的接入和分发。把它放到公有云上绕不开两个问题UDP 端口很容易被 NAT 和安全组拦掉桥接网络又会让 WebRTC 客户端拿不到正确地址。先说结论上云之后把传输尽量收敛到 TCP、显式声明公网 IP这两件事做完绝大多数部署问题就解决了。先跑起来MediaMTX Docker 一行命令官方镜像bluenviron/mediamtx:1基于 scratch 构建见 docker/standard.Dockerfile没有 shell镜像体积只有几 MB。一条命令起服务TCP/UDP 端口按官方安装文档列全docker run --rm -d \ -e MTX_WEBRTCADDITIONALHOSTS你的公网IP \ -p 8554:8554 -p 1935:1935 \ -p 8888:8888 -p 8889:8889 \ -p 8892:8892 -p 8892:8892/udp -p 8893:8893/udp \ -p 8890:8890/udp -p 8189:8189/udp \ bluenviron/mediamtx:1常用端口速查默认值来自 mediamtx.yml协议端口说明RTSP8554默认开启RTMP1935默认开启HLS8888播放列表与分片WebRTC8889 / 8189(udp)信令走 HTTP媒体走 UDPSRT8890(udp)需安全组放行 UDPMoQ8892 / 8893(udp)QUIC/WebTransport验证标准很简单浏览器访问http://公网IP:8888/能看到路径列表页面就算起来了拉流测试用ffplay rtsp://公网IP:8554/路径名能看到画面即可。配置怎么调环境变量优先于配置文件MediaMTX 支持用MTX_前缀的环境变量覆盖配置项比挂载配置文件更轻。云上常用的几个-e MTX_WEBRTCADDITIONALHOSTS1.2.3.4 -e MTX_RTSPTRANSPORTStcp -e MTX_HLSVARIANTlowLatency三个必须理解的参数1. WebRTC 公网地址。webrtcAdditionalHosts告诉客户端该往哪个 IP 回媒体流。云主机上它拿到的是内网 IP客户端自然连不回来把公网 IP 填进去即可多 IP 可写多个。2. RTSP 强制 TCP。Docker 的 NAT 会改写 UDP 报文里的源地址端口导致 RTSP over UDP 失败。非 host 网络模式下加MTX_RTSPTRANSPORTStcp一刀切掉问题。3. 低延迟 HLS 怎么配。hlsVariant默认就是lowLatencyhlsPartDuration: 200ms、hlsSegmentDuration: 1s的组合能压到秒级以下如果目标设备兼容性优先改成mpegts更稳。注意 LL-HLS 在苹果设备上要求 HTTPS公网播放记得配证书。带宽兜底两个参数pathDefaults.maxReaders限制单路流的并发读者数0 为不限sourceOnDemand: true则让拉流源有人看才拉、没人看 10 秒后断开sourceOnDemandCloseAfter可调按量计费的网络带宽能省一大截。别急着上 K8sDeployment 怎么写单机能稳定跑之前不建议直接上 Kubernetes。真到了需要多副本、自动恢复的阶段记住三条--networkhost在 K8s 里不可用所以全 TCP 显式声明 UDP 端口是唯一可靠路径把mediamtx.yml放进 ConfigMap 挂载使用MediaMTX 支持配置热加载改 ConfigMap 不用重启 Pod录像文件用 PVC 挂出去别写在容器临时层里。spec: containers: - name: mediamtx image: bluenviron/mediamtx:1 args: [/mediamtx, /config/mediamtx.yml] ports: - {containerPort: 8554, protocol: TCP} - {containerPort: 1935, protocol: TCP} - {containerPort: 8888, protocol: TCP} - {containerPort: 8889, protocol: TCP} - {containerPort: 8189, protocol: UDP} volumeMounts: - {name: config, mountPath: /config} - {name: rec, mountPath: /recordings} env: - name: MTX_RTSPTRANSPORTS value: tcp - name: MTX_WEBRTCADDITIONALHOSTS value: 1.2.3.4扩缩容不用等CPU 到 70% 触发 HPA 加副本MediaMTX 是单进程、按流数吃内存的副本数按单实例可承载的并发流数来估而不是拍脑袋。生产环境三件事健康检查走 Control API。api: true后9997 端口提供 HTTP 接口GET /v3/paths返回 200 即代表服务正常。注意镜像里没装 curl容器内探针用 TCP 探测 9997 端口或者用带 curl 的 sidecar。监控指标接 Prometheus。metrics: true后 9998 端口暴露 Prometheus 格式指标sources、readers计数加收发字节数是告警三板斧。日志与录像要设边界。容器环境日志只走 stdout 最省事文件落盘的话交给宿主机的 logrotate官方文档给了现成配置见 docs/2-features/18-logging.md。录像默认只保留一天recordDeleteAfter: 1d云盘容量按这个值反推。⚠️ 最后强调一条默认配置里authInternalUsers是任何人可发布和读取仅 API/Metrics 限本地直接暴露到公网等于裸奔。上线前至少把ips字段收紧成办公网段或 CDN 出口 IP。踩坑记录全是真实代价WebRTC 连不上日志毫无报错99% 是webrtcAdditionalHosts配的是内网 IP。先查这条再考虑 STUN/TURN。RTSP over UDP 时通时断Docker NAT 改写了五元组加MTX_RTSPTRANSPORTStcp解决坚持要 UDP 就上 host 网络但那样又回不到 K8s 的平滑路径自己权衡。healthcheck 里写curl永远失败scratch 镜像里没有 curl别再贴模板配置了。LL-HLS 在 Safari 黑屏苹果设备要求 HTTPS 的 LL-HLShlsEncryption打开并配好证书。写在最后MediaMTX 上云不复杂复杂的是把网络参数想清楚。下一步建议就用本文的 Docker 命令在你自己的云主机上把 RTSP HLS 两条链路各跑通一次再对照生产环境三件事逐项加比直接抄一套 K8s 清单快得多。【免费下载链接】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),仅供参考
返回列表