基于 MediaMTX 的微信小程序 Web 实时音视频实操方案
我现在有一个微信小程序,里面有个实时音视频功能,目前用的是腾讯云的。考虑到成本问题,我想自己基于开源的livekit 搭建一个代替腾讯云的实时音视频。请问方案是否可行,如果可行,帮我写出详细的落地方案。
很现实的一个需求!毕竟TX实时音视频的费用是越来越贵!!
向 ChatGPT 提问的时候,我只知道一个 Livekit,根本不知道 MediaMTX
。
实际使用实时音视频场景 主要是医生PC端,医生小程序端,患者小程序端。可以继续沿用live-pusher 和live-player。给出详细的实施方案。目前使用的是腾讯的实时音视频 trtc的方案 https://cloud.tencent.com/document/product/647/116548
二、ChatGPT 提供的几种方案对比
方案 A:全部使用 MediaMTX(推荐)
医生端 (Web) ---> WebRTC 推流 ---> MediaMTX ---> RTMP/FLV ---> 小程序↑ ↑FLV 播放 <--- MediaMTX <--- RTMP 推流 <--- 小程序
优点:
- MediaMTX 原生支持 WebRTC → RTMP/FLV 转换
- 配置简单,一个服务器搞定
- 不需要 LiveKit
缺点:
- 小程序只能使用 RTMP/FLV,延迟略高
- 不支持复杂多房间逻辑
方案 B:全部使用 LiveKit(最佳体验)
医生端 (Web) ---> WebRTC ---> LiveKit <---> WebRTC ---> 小程序↑ ↑WebRTC 接收 <--- LiveKit <---> WebRTC <--- 小程序
优点:
- 端到端低延迟,体验最好
- 多人会议和房间管理方便
缺点:
- 小程序无法直接使用
live-pusher mode="RTC"
连接 - 需要 TRTC SDK 或自研 WebRTC adapter
- 实现复杂,生产环境门槛高
方案 C:简化 RTMP + FFmpeg(快速验证)
医生端 (Web) ---> WebM ---> 后端 FFmpeg ---> RTMP ---> MediaMTX ---> FLV ---> 小程序↑ ↑FLV 播放 <--- MediaMTX <--- RTMP <--- live-pusher (小程序)
优点:
- 实现简单,可快速验证
- 利用现有 MediaMTX,无需 LiveKit
缺点:
- 后端依赖 FFmpeg
- 延迟较高(2-5 秒)
三、本地快速验证步骤(方案 C)
-
部署 MediaMTX
docker-compose up -d
- 暴露端口:
7880
(WebRTC/HTTP),1935
(RTMP),8889
(FLV)
- 暴露端口:
-
启动 Node 后端
提供 RTMP 推流和 FLV 播放地址cd server npm install node server.js
如果提示端口被占
netstat -ano | findstr ":<端口号>"
结束 PID 进程
taskkill /pid <PID号> /f
-
启动医生端 React 前端
cd web-doctor npm install npm run dev
- 浏览器访问
http://localhost:5173
- 通过 WebRTC 推流到 MediaMTX
- 使用
flv.js
播放患者端 RTMP 推来的流
- 浏览器访问
-
小程序患者端
- 使用
live-pusher
推 RTMP 到 MediaMTX - 使用
live-player
播 FLV
- 使用
四、实操
本地进行方案 调试过程,开始想着是方案C 最后走到了 A。
初始代码是ChatGPT
直接生成的一个zip
包,这点很赞,不像DeepSeek,给的链接或是包都是虚构的。。。
文件结构
livekit-demo/
├── docker-compose.yml # 启动 LiveKit + MediaMTX
├── server/
│ ├── package.json
│ ├── server.js # Node 后端
└── miniprogram/├── app.js├── app.json├── pages/│ └── index/│ ├── index.wxml│ ├── index.js│ └── index.wxss
docker-compose.yml (放在 livekit-demo 根目录)
version: '3.8'services:livekit:image: livekit/livekit-servercontainer_name: livekitports:- "7880:7880"- "7881:7881/tcp"- "7882:7882/udp"