diff --git a/README.md b/README.md index 80d108d..6bd8be9 100644 --- a/README.md +++ b/README.md @@ -18,32 +18,122 @@ 参考文档:`https://docs.qq.com/flowchart-addon` -## 前置准备(仅需配置1次) +## 整体部署步骤(细化版) -### 环境部署(Win10服务器 + 32台终端) +### 步骤1:服务器端 -#### 服务器端(部署 MediaMTX+Python+FFmpeg) -1. 下载并解压以下工具到 D:\ScreenCast 目录(统一路径方便脚本调用): - - MediaMTX:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版,解压后改名为mediamtx) - - FFmpeg:`https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z`(解压后改名为ffmpeg) - - Python:`https://www.python.org/downloads/windows/`(安装时勾选「Add Python to PATH」) +1. **下载并解压MediaMTX** + - 下载地址:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版) + - 解压到 `D:\ScreenCast\mediamtx` 目录 -2. 安装 Python 依赖(管理员 cmd 执行): - ``` - pip install pyautogui requests subprocess32 psutil - ``` +2. **配置MediaMTX** + - 编辑 `D:\ScreenCast\mediamtx\mediamtx.yml` 文件: + - 设置 `webRTCAddress` 和 `rtmpAddress` + - 添加 `screen` 路径配置,暂时不设鉴权 -3. 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD)。 +3. **启动MediaMTX** + - 运行 `mediamtx.exe` + - 观察控制台是否监听对应端口 -#### 终端端(32台Win10) -1. 安装 Python(同上),仅需执行1次依赖安装: - ``` - pip install pyautogui - ``` +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 + ``` -2. 确保 Chrome/Edge 浏览器安装在默认路径(C:\Program Files\Google\Chrome\Application\chrome.exe)。 +5. **开启权限** + - 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD) -### 核心文件结构(统一放在服务器D:\ScreenCast) +### 步骤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