# 会议投屏系统 ## 项目简介 面向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,转换为 BGR(OpenCV 格式) 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台终端、停止所有服务),适合管理员操作。