Files
meetingroom-netscreen/README.md

158 lines
5.5 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**单台终端设备作为信号源向其余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. **访问流地址**
- 输入地址:`http://服务器IP:8889/webrtc.html?src=screen`
- 确认能看到主播机屏幕画面
3. **批量部署**
- 在32台终端上运行 `auto_receive.py` 脚本
- 脚本会自动打开Chrome并跳转到流地址
## 核心文件结构统一放在服务器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台终端、停止所有服务适合管理员操作。