Files
meetingroom-netscreen/README.md

237 lines
7.3 KiB
Markdown
Raw Normal View History

# 会议投屏系统
## 项目简介
面向32台终端的内网低延迟屏幕广播系统支持网络投屏、硬件接口互通、一键自动化运维。
## 需求说明
当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下三类
1. **模式1**单台终端设备作为信号源向其余31台终端设备进行投屏传输。
2. **模式2**主控设备同时向31台终端设备传输本地视频信号并同步接入远程视频会议内容。
3. **模式3**视频会议内容直接投屏至全部32台终端设备的显示界面。
技术说明上述32台终端设备均通过有线网络实现互联互通。
## 解决方案
参考文档:`https://docs.qq.com/flowchart-addon`
## 整体部署步骤(细化版)
### 步骤1服务器端
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`
- 安装Python依赖管理员cmd执行
```
pip install pyautogui requests subprocess32 psutil mss numpy
```
5. **开启权限**
- 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD
### 步骤2主播机
**方案A使用push_screen.py脚本**
- 双击运行 `push_screen.py`
- 点击「一键全屏投屏」按钮
- 脚本会自动启动MediaMTX并开始推流
**方案B使用mss抓屏+FFmpeg推流**
```python
import subprocess
import time
import mss
import numpy as np
# ---------- 配置 ----------
RTMP_URL = "rtmp://服务器IP:1935/screen" # MediaMTX 的推流地址
FPS = 24
WIDTH, HEIGHT = 1280, 720
# 初始化屏幕捕获
with mss.mss() as sct:
# 你可以只抓取部分区域,这里抓整个主显示器
monitor = sct.monitors[1] # 1 表示主显示器
# 如果想指定区域,可以改为类似:
# monitor = {"top": 100, "left": 100, "width": 1280, "height": 720}
# FFmpeg 命令,编码为 H.264 并推 RTMP
command = [
'ffmpeg',
'-y', # 覆盖输出文件
'-f', 'rawvideo', # 输入原始视频
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24', # mss 默认输出 BGRA我们后面转成 BGR24
'-s', f'{WIDTH}x{HEIGHT}', # 尺寸
'-r', str(FPS), # 帧率
'-i', '-', # 从标准输入读取
'-c:v', 'libx264', # H.264 编码
'-pix_fmt', 'yuv420p',
'-preset', 'ultrafast', # 编码速度优先,延迟低
'-f', 'flv',
RTMP_URL
]
process = subprocess.Popen(command, stdin=subprocess.PIPE)
last_time = time.time()
try:
while True:
# 抓取屏幕
img = np.array(sct.grab(monitor))
# mss 返回的是 BGRA转换为 BGROpenCV 格式)
frame = img[..., :3] # 去掉 Alpha 通道
# 如果需要缩放到 WIDTH x HEIGHT
# frame = cv2.resize(frame, (WIDTH, HEIGHT))
# 写入 FFmpeg 的 stdin
process.stdin.write(frame.tobytes())
# 简单的帧率控制
elapsed = time.time() - last_time
sleep_time = (1.0 / FPS) - elapsed
if sleep_time > 0:
time.sleep(sleep_time)
last_time = time.time()
except KeyboardInterrupt:
print("用户停止推流")
finally:
process.stdin.close()
process.wait()
```
### 步骤3观众机
1. **打开浏览器**
- 在任意观众机上打开 Chrome 浏览器
2. **访问流地址**
2026-03-19 11:18:54 +08:00
- 输入地址:`http://服务器IP:8889/screen`
- MediaMTX 会自动处理 WebRTC 协商,把 RTMP 流转成 WebRTC 给浏览器
- 确认能看到主播机屏幕画面
3. **批量部署**
- 在32台终端上运行 `auto_receive.py` 脚本
- 脚本会自动打开Chrome并跳转到流地址
## 模式2HDMI采集卡方案
本模式适用于服务器安装了视频采集卡可以接受外部HDMI信号的场景。
### 步骤1安装FFmpeg
- 下载FFmpeg`https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z`
- 解压到 `D:\ScreenCast\ffmpeg` 目录
- 确保 `D:\ScreenCast\ffmpeg\bin\ffmpeg.exe` 可用
### 步骤2列出DirectShow设备
在命令行执行以下命令,列出所有 DirectShow 设备:
```bat
ffmpeg -list_devices true -f dshow -i dummy
```
输出示例:
```
[dshow @ ...] DirectShow video devices
[dshow @ ...] "USB Video Device"
[dshow @ ...] "AVerMedia HD Capture"
```
记下要使用的设备名称。
### 步骤3配置MediaMTX
编辑 `mediamtx.yml`,添加 `hdmi` 路径配置:
```yaml
paths:
hdmi:
# source 不写,或者写 publisher表示"由客户端推流进来"
# source: publisher
# 局域网可以先不开认证
# publishUser: ""
# publishPass: ""
# 有读者时才拉源(这里用不到,因为是 publisher 模式)
sourceOnDemand: no
```
### 步骤4启动MediaMTX
```bat
./mediamtx
```
看到日志里 RTMP/RTSP/WebRTC 端口监听就表示启动成功。
### 步骤5用FFmpeg采集采集卡并推流
假设:
- MediaMTX 服务器 IP192.168.1.100
- 推流路径名hdmi
- DirectShow 设备名称:"AVerMedia HD Capture"
```bat
ffmpeg -f dshow -i video="AVerMedia HD Capture" ^
-c:v libx264 -preset ultrafast -tune zerolatency ^
-profile:v baseline -pix_fmt yuv420p ^
-b:v 4000k -maxrate 4000k -bufsize 8000k ^
-g 30 ^
-f flv rtmp://192.168.1.100/hdmi
```
### 步骤6客户端观看
在浏览器中直接访问:
```
http://192.168.1.100:8889/hdmi
```
MediaMTX 会返回内置的 WebRTC 播放页面浏览器会自动播放HDMI信号。
## 核心文件结构统一放在服务器D:\ScreenCast
```
D:\ScreenCast
├── mediamtx/ # MediaMTX解压目录
│ └── mediamtx.exe
├── ffmpeg/ # FFmpeg解压目录
│ └── bin/ffmpeg.exe
├── push_screen.py # 投屏源推流脚本(一键采集)
├── auto_receive.py # 终端自动打开浏览器脚本
└── manage_server.py # 运维总控脚本(启动/切换模式/停止)
```
## 核心Python脚本
### 脚本1投屏源推流脚本push_screen.py
功能双击即可采集Win10屏幕自动推流到MediaMTX无需敲命令支持「全屏/指定窗口」投屏,带可视化提示。
### 脚本2终端自动打开浏览器脚本auto_receive.py
功能双击脚本自动打开Chrome浏览器全屏直接跳转到投屏/会议流页面支持批量部署到32台终端无需手动输入地址。
### 脚本3运维总控脚本manage_server.py
功能一站式运维启动MediaMTX、切换三种模式、批量控制32台终端、停止所有服务适合管理员操作。