更新README.md,添加详细部署步骤
This commit is contained in:
124
README.md
124
README.md
@@ -18,32 +18,122 @@
|
|||||||
|
|
||||||
参考文档:`https://docs.qq.com/flowchart-addon`
|
参考文档:`https://docs.qq.com/flowchart-addon`
|
||||||
|
|
||||||
## 前置准备(仅需配置1次)
|
## 整体部署步骤(细化版)
|
||||||
|
|
||||||
### 环境部署(Win10服务器 + 32台终端)
|
### 步骤1:服务器端
|
||||||
|
|
||||||
#### 服务器端(部署 MediaMTX+Python+FFmpeg)
|
1. **下载并解压MediaMTX**
|
||||||
1. 下载并解压以下工具到 D:\ScreenCast 目录(统一路径方便脚本调用):
|
- 下载地址:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版)
|
||||||
- MediaMTX:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版,解压后改名为mediamtx)
|
- 解压到 `D:\ScreenCast\mediamtx` 目录
|
||||||
- FFmpeg:`https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z`(解压后改名为ffmpeg)
|
|
||||||
- Python:`https://www.python.org/downloads/windows/`(安装时勾选「Add Python to PATH」)
|
|
||||||
|
|
||||||
2. 安装 Python 依赖(管理员 cmd 执行):
|
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
|
pip install pyautogui requests subprocess32 psutil mss numpy
|
||||||
```
|
```
|
||||||
|
|
||||||
3. 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD)。
|
5. **开启权限**
|
||||||
|
- 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD)
|
||||||
|
|
||||||
#### 终端端(32台Win10)
|
### 步骤2:主播机
|
||||||
1. 安装 Python(同上),仅需执行1次依赖安装:
|
|
||||||
```
|
|
||||||
pip install pyautogui
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 确保 Chrome/Edge 浏览器安装在默认路径(C:\Program Files\Google\Chrome\Application\chrome.exe)。
|
**方案A:使用push_screen.py脚本**
|
||||||
|
- 双击运行 `push_screen.py`
|
||||||
|
- 点击「一键全屏投屏」按钮
|
||||||
|
- 脚本会自动启动MediaMTX并开始推流
|
||||||
|
|
||||||
### 核心文件结构(统一放在服务器D:\ScreenCast)
|
**方案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
|
D:\ScreenCast
|
||||||
|
|||||||
Reference in New Issue
Block a user