From db77b32021f4e75f47ecd3e16c6756d45f6e58b1 Mon Sep 17 00:00:00 2001 From: xiaji Date: Thu, 19 Mar 2026 15:48:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B5=8B=E8=AF=95=E6=96=B9?= =?UTF-8?q?=E6=A1=88=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 125 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 109 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 723861d..483e0a0 100644 --- a/README.md +++ b/README.md @@ -9,15 +9,14 @@ 当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下两类: 1. **模式1(主播投屏)**:单台终端设备作为信号源,向MediaMTX服务器投送本地画面(流的形式),其余31台终端设备读取MediaMTX服务器的流。 - - **特殊情况**:单独架设1台机器,用浏览器读取流,然后通过HDMI线将显示画面输出到视频矩阵系统。 - + - **特殊情况**:单独架设1台机器,用浏览器读取流,然后通过HDMI线将显示画面输出到矩阵系统,矩阵再发送给第三方视频会议系统。这台机器可利用墙上的插座。 2. **模式2(视频会议)**:在MediaMTX服务器上用采集卡和FFmpeg读取设备内容,发布流,全部32台终端设备用浏览器读取MediaMTX服务器的流。 技术说明:上述32台终端设备均通过有线网络实现互联互通。 ## 解决方案 -参考文档:`https://docs.qq.com/flowchart-addon` +参考文档: ## 整体部署步骤(细化版) @@ -26,16 +25,13 @@ 1. **下载并解压MediaMTX** - 下载地址:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版) - 解压到 `D:\ScreenCast\mediamtx` 目录 - 2. **配置MediaMTX** - 编辑 `D:\ScreenCast\mediamtx\mediamtx.yml` 文件: - 设置 `webRTCAddress` 和 `rtmpAddress` - 添加 `screen` 路径配置,暂时不设鉴权 - 3. **启动MediaMTX** - 运行 `mediamtx.exe` - 观察控制台是否监听对应端口 - 4. **安装依赖** - 安装Python:`https://www.python.org/downloads/windows/`(勾选「Add Python to PATH」) - 安装FFmpeg:`https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z`(解压到 `D:\ScreenCast\ffmpeg`) @@ -43,7 +39,6 @@ ``` pip install pyautogui requests subprocess32 psutil mss numpy ``` - 5. **开启权限** - 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD) @@ -53,12 +48,14 @@ ### 主播端:推送本机屏幕 -**方案A:使用push_screen.py脚本** +**方案A:使用push\_screen.py脚本** + - 双击运行 `push_screen.py` - 点击「一键全屏投屏」按钮 - 脚本会自动启动MediaMTX并开始推流 **方案B:使用mss抓屏+FFmpeg推流** + ```python import subprocess import time @@ -117,12 +114,10 @@ with mss.mss() as sct: 1. **打开浏览器** - 在任意观众机上打开 Chrome 浏览器 - 2. **访问流地址** - 输入地址:`http://服务器IP:8889/screen` - MediaMTX 会自动处理 WebRTC 协商,把 RTMP 流转成 WebRTC 给浏览器 - 确认能看到主播机屏幕画面 - 3. **批量部署** - 在31台终端上运行 `auto_receive.py` 脚本 - 脚本会自动打开Chrome并跳转到流地址 @@ -133,10 +128,8 @@ with mss.mss() as sct: 1. **准备一台小机器** - 配置要求较低,能运行Chrome浏览器即可 - 2. **访问流地址** - 打开浏览器访问:`http://服务器IP:8889/screen` - 3. **HDMI输出到矩阵** - 通过HDMI线将小机器连接到视频矩阵系统 - 小机器播放的流画面将输出到矩阵系统 @@ -160,6 +153,7 @@ ffmpeg -list_devices true -f dshow -i dummy ``` 输出示例: + ``` [dshow @ ...] DirectShow video devices [dshow @ ...] "USB Video Device" @@ -197,6 +191,7 @@ paths: ### 步骤5:用FFmpeg采集采集卡并推流 假设: + - MediaMTX 服务器 IP:192.168.1.100 - 推流路径名:hdmi - DirectShow 设备名称:"AVerMedia HD Capture" @@ -213,6 +208,7 @@ ffmpeg -f dshow -i video="AVerMedia HD Capture" ^ ### 步骤6:客户端观看 在浏览器中直接访问: + ``` http://192.168.1.100:8889/hdmi ``` @@ -221,6 +217,100 @@ MediaMTX 会返回内置的 WebRTC 播放页面,浏览器会自动播放HDMI 所有32台终端均可通过浏览器访问上述地址观看视频会议内容。 +## 测试方案 + +使用1台台式机模拟MediaMTX服务器,2台笔记本分别模拟信号源和观众,测试两种场景。 + +### 设备准备 + +| 设备 | 角色 | IP地址示例 | +|------|------|-----------| +| 台式机 | MediaMTX服务器 | 192.168.1.100 | +| 笔记本A | 信号源(主播) | 192.168.1.101 | +| 笔记本B | 观众端 | 192.168.1.102 | + +### 前置条件 + +1. 三台设备处于同一局域网 +2. 台式机已安装MediaMTX和FFmpeg +3. 笔记本A已安装Python和FFmpeg +4. 所有设备关闭防火墙或开放对应端口 + +### 场景1测试:主播投屏 + +**拓扑**:笔记本A(信号源)→ 台式机(MediaMTX)→ 笔记本B(观众) + +**步骤**: + +1. **台式机启动MediaMTX** + ``` + D:\ScreenCast\mediamtx\mediamtx.exe + ``` + 确认控制台显示端口监听正常 + +2. **笔记本A启动推流** + - 运行 `push_screen.py` + - 或使用命令行推流: + ```bat + ffmpeg -f gdigrab -framerate 30 -i desktop -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://192.168.1.100:8554/screen + ``` + +3. **笔记本B观看** + - 打开Chrome浏览器 + - 访问:`http://192.168.1.100:8889/screen` + - 确认能看到笔记本A的屏幕画面 + +**验证点**: +- [ ] 推流端无错误 +- [ ] MediaMTX日志显示有客户端连接 +- [ ] 观众端能流畅播放画面 +- [ ] 延迟在可接受范围内(<1秒) + +### 场景2测试:视频会议(采集卡模式) + +**拓扑**:外部HDMI信号 → 台式机(采集卡+FFmpeg)→ 台式机(MediaMTX)→ 笔记本A/B(观众) + +**前置条件**:台式机已连接视频采集卡 + +**步骤**: + +1. **列出采集卡设备** + ```bat + ffmpeg -list_devices true -f dshow -i dummy + ``` + 记录设备名称 + +2. **台式机启动MediaMTX** + ``` + D:\ScreenCast\mediamtx\mediamtx.exe + ``` + +3. **台式机启动FFmpeg推流** + ```bat + ffmpeg -f dshow -i video="采集卡设备名称" -c:v libx264 -preset ultrafast -tune zerolatency -f flv rtmp://192.168.1.100/hdmi + ``` + +4. **笔记本A和B观看** + - 打开Chrome浏览器 + - 访问:`http://192.168.1.100:8889/hdmi` + - 确认能看到采集卡的HDMI输入画面 + +**验证点**: +- [ ] 采集卡设备被正确识别 +- [ ] FFmpeg推流无错误 +- [ ] MediaMTX正确转发流 +- [ ] 多客户端能同时观看 + +### 测试记录表 + +| 测试项 | 预期结果 | 实际结果 | 是否通过 | +|--------|----------|----------|----------| +| MediaMTX启动 | 端口监听正常 | | | +| 场景1推流 | 无错误 | | | +| 场景1观看 | 画面流畅 | | | +| 场景2推流 | 无错误 | | | +| 场景2多客户端 | 至少2台同时观看 | | | + ## 核心文件结构(统一放在服务器D:\ScreenCast) ``` @@ -236,11 +326,14 @@ D:\ScreenCast ## 核心Python脚本 -### 脚本1:投屏源推流脚本(push_screen.py) +### 脚本1:投屏源推流脚本(push\_screen.py) + 功能:双击即可采集Win10屏幕,自动推流到MediaMTX,无需敲命令;支持「全屏/指定窗口」投屏,带可视化提示。 -### 脚本2:终端自动打开浏览器脚本(auto_receive.py) +### 脚本2:终端自动打开浏览器脚本(auto\_receive.py) + 功能:双击脚本自动打开Chrome浏览器(全屏),直接跳转到投屏/会议流页面;支持批量部署到32台终端,无需手动输入地址。 -### 脚本3:运维总控脚本(manage_server.py) -功能:一站式运维(启动MediaMTX、切换两种模式、批量控制32台终端、停止所有服务),适合管理员操作。 \ No newline at end of file +### 脚本3:运维总控脚本(manage\_server.py) + +功能:一站式运维(启动MediaMTX、切换两种模式、批量控制32台终端、停止所有服务),适合管理员操作。