Files
meetingroom-netscreen/README.md

243 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 会议投屏系统
## 项目简介
面向32台终端的内网低延迟屏幕广播系统支持网络投屏、硬件接口互通、一键自动化运维。
## 需求说明
当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下三类
1. **模式1主播推送**主席台的机器推送本机屏幕画面到MediaMTX服务器。
2. **模式2网页观看**MediaMTX服务器发布流19台终端通过网页观看流。
3. **模式3矩阵输出**另外一台小机器通过HDMI线将显示画面输出到视频矩阵系统。
技术说明上述32台终端设备均通过有线网络实现互联互通。
## 解决方案
参考文档:`https://docs.qq.com/flowchart-addon`
## 整体部署步骤(细化版)
### 步骤1MediaMTX服务器端
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
### 模式1主播推送本机屏幕 → MediaMTX
主席台机器运行推流脚本将本机屏幕画面推送到MediaMTX服务器。
**方案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] # 主显示器
# FFmpeg 命令,编码为 H.264 并推 RTMP
command = [
'ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', f'{WIDTH}x{HEIGHT}',
'-r', str(FPS),
'-i', '-',
'-c:v', 'libx264',
'-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))
frame = img[..., :3]
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()
```
### 模式2网页观看MediaMTX → 19台终端
MediaMTX服务器发布流其他终端通过浏览器观看。
1. **打开浏览器**
- 在任意观众机上打开 Chrome 浏览器
2. **访问流地址**
- 输入地址:`http://服务器IP:8889/screen`
- MediaMTX 会自动处理 WebRTC 协商,把 RTMP 流转成 WebRTC 给浏览器
- 确认能看到主播机屏幕画面
3. **批量部署**
- 在19台终端上运行 `auto_receive.py` 脚本
- 脚本会自动打开Chrome并跳转到流地址
### 模式3矩阵输出HDMI → 视频矩阵)
额外的一台小机器通过HDMI线将显示画面输出到视频矩阵系统。
1. **准备一台小机器**
- 配置要求较低能运行Chrome浏览器即可
2. **访问流地址**
- 打开浏览器访问:`http://服务器IP:8889/screen`
3. **HDMI输出到矩阵**
- 通过HDMI线将小机器连接到视频矩阵系统
- 小机器播放的流画面将输出到矩阵系统
## 模式2补充HDMI采集卡方案
本模式适用于服务器安装了视频采集卡可以接受外部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台终端、停止所有服务适合管理员操作。