重写README,调整三种模式说明
This commit is contained in:
66
README.md
66
README.md
@@ -8,9 +8,9 @@
|
|||||||
|
|
||||||
当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下三类:
|
当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下三类:
|
||||||
|
|
||||||
1. **模式1**:单台终端设备作为信号源,向其余31台终端设备进行投屏传输。
|
1. **模式1(主播推送)**:主席台的机器推送本机屏幕画面到MediaMTX服务器。
|
||||||
2. **模式2**:主控设备同时向31台终端设备传输本地视频信号,并同步接入远程视频会议内容。
|
2. **模式2(网页观看)**:MediaMTX服务器发布流,19台终端通过网页观看流。
|
||||||
3. **模式3**:视频会议内容直接投屏至全部32台终端设备的显示界面。
|
3. **模式3(矩阵输出)**:另外一台小机器通过HDMI线将显示画面输出到视频矩阵系统。
|
||||||
|
|
||||||
技术说明:上述32台终端设备均通过有线网络实现互联互通。
|
技术说明:上述32台终端设备均通过有线网络实现互联互通。
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
## 整体部署步骤(细化版)
|
## 整体部署步骤(细化版)
|
||||||
|
|
||||||
### 步骤1:服务器端
|
### 步骤1:MediaMTX服务器端
|
||||||
|
|
||||||
1. **下载并解压MediaMTX**
|
1. **下载并解压MediaMTX**
|
||||||
- 下载地址:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版)
|
- 下载地址:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版)
|
||||||
@@ -46,7 +46,9 @@
|
|||||||
5. **开启权限**
|
5. **开启权限**
|
||||||
- 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD)
|
- 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD)
|
||||||
|
|
||||||
### 步骤2:主播机
|
### 模式1:主播推送(本机屏幕 → MediaMTX)
|
||||||
|
|
||||||
|
主席台机器运行推流脚本,将本机屏幕画面推送到MediaMTX服务器。
|
||||||
|
|
||||||
**方案A:使用push_screen.py脚本**
|
**方案A:使用push_screen.py脚本**
|
||||||
- 双击运行 `push_screen.py`
|
- 双击运行 `push_screen.py`
|
||||||
@@ -67,46 +69,34 @@ WIDTH, HEIGHT = 1280, 720
|
|||||||
|
|
||||||
# 初始化屏幕捕获
|
# 初始化屏幕捕获
|
||||||
with mss.mss() as sct:
|
with mss.mss() as sct:
|
||||||
# 你可以只抓取部分区域,这里抓整个主显示器
|
monitor = sct.monitors[1] # 主显示器
|
||||||
monitor = sct.monitors[1] # 1 表示主显示器
|
|
||||||
# 如果想指定区域,可以改为类似:
|
|
||||||
# monitor = {"top": 100, "left": 100, "width": 1280, "height": 720}
|
|
||||||
|
|
||||||
# FFmpeg 命令,编码为 H.264 并推 RTMP
|
# FFmpeg 命令,编码为 H.264 并推 RTMP
|
||||||
command = [
|
command = [
|
||||||
'ffmpeg',
|
'ffmpeg',
|
||||||
'-y', # 覆盖输出文件
|
'-y',
|
||||||
'-f', 'rawvideo', # 输入原始视频
|
'-f', 'rawvideo',
|
||||||
'-vcodec', 'rawvideo',
|
'-vcodec', 'rawvideo',
|
||||||
'-pix_fmt', 'bgr24', # mss 默认输出 BGRA,我们后面转成 BGR24
|
'-pix_fmt', 'bgr24',
|
||||||
'-s', f'{WIDTH}x{HEIGHT}', # 尺寸
|
'-s', f'{WIDTH}x{HEIGHT}',
|
||||||
'-r', str(FPS), # 帧率
|
'-r', str(FPS),
|
||||||
'-i', '-', # 从标准输入读取
|
'-i', '-',
|
||||||
'-c:v', 'libx264', # H.264 编码
|
'-c:v', 'libx264',
|
||||||
'-pix_fmt', 'yuv420p',
|
'-pix_fmt', 'yuv420p',
|
||||||
'-preset', 'ultrafast', # 编码速度优先,延迟低
|
'-preset', 'ultrafast',
|
||||||
'-f', 'flv',
|
'-f', 'flv',
|
||||||
RTMP_URL
|
RTMP_URL
|
||||||
]
|
]
|
||||||
|
|
||||||
process = subprocess.Popen(command, stdin=subprocess.PIPE)
|
process = subprocess.Popen(command, stdin=subprocess.PIPE)
|
||||||
|
|
||||||
last_time = time.time()
|
last_time = time.time()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
# 抓取屏幕
|
|
||||||
img = np.array(sct.grab(monitor))
|
img = np.array(sct.grab(monitor))
|
||||||
# mss 返回的是 BGRA,转换为 BGR(OpenCV 格式)
|
frame = img[..., :3]
|
||||||
frame = img[..., :3] # 去掉 Alpha 通道
|
|
||||||
|
|
||||||
# 如果需要缩放到 WIDTH x HEIGHT:
|
|
||||||
# frame = cv2.resize(frame, (WIDTH, HEIGHT))
|
|
||||||
|
|
||||||
# 写入 FFmpeg 的 stdin
|
|
||||||
process.stdin.write(frame.tobytes())
|
process.stdin.write(frame.tobytes())
|
||||||
|
|
||||||
# 简单的帧率控制
|
|
||||||
elapsed = time.time() - last_time
|
elapsed = time.time() - last_time
|
||||||
sleep_time = (1.0 / FPS) - elapsed
|
sleep_time = (1.0 / FPS) - elapsed
|
||||||
if sleep_time > 0:
|
if sleep_time > 0:
|
||||||
@@ -120,7 +110,9 @@ with mss.mss() as sct:
|
|||||||
process.wait()
|
process.wait()
|
||||||
```
|
```
|
||||||
|
|
||||||
### 步骤3:观众机
|
### 模式2:网页观看(MediaMTX → 19台终端)
|
||||||
|
|
||||||
|
MediaMTX服务器发布流,其他终端通过浏览器观看。
|
||||||
|
|
||||||
1. **打开浏览器**
|
1. **打开浏览器**
|
||||||
- 在任意观众机上打开 Chrome 浏览器
|
- 在任意观众机上打开 Chrome 浏览器
|
||||||
@@ -131,10 +123,24 @@ with mss.mss() as sct:
|
|||||||
- 确认能看到主播机屏幕画面
|
- 确认能看到主播机屏幕画面
|
||||||
|
|
||||||
3. **批量部署**
|
3. **批量部署**
|
||||||
- 在32台终端上运行 `auto_receive.py` 脚本
|
- 在19台终端上运行 `auto_receive.py` 脚本
|
||||||
- 脚本会自动打开Chrome并跳转到流地址
|
- 脚本会自动打开Chrome并跳转到流地址
|
||||||
|
|
||||||
## 模式2:HDMI采集卡方案
|
### 模式3:矩阵输出(HDMI → 视频矩阵)
|
||||||
|
|
||||||
|
额外的一台小机器通过HDMI线将显示画面输出到视频矩阵系统。
|
||||||
|
|
||||||
|
1. **准备一台小机器**
|
||||||
|
- 配置要求较低,能运行Chrome浏览器即可
|
||||||
|
|
||||||
|
2. **访问流地址**
|
||||||
|
- 打开浏览器访问:`http://服务器IP:8889/screen`
|
||||||
|
|
||||||
|
3. **HDMI输出到矩阵**
|
||||||
|
- 通过HDMI线将小机器连接到视频矩阵系统
|
||||||
|
- 小机器播放的流画面将输出到矩阵系统
|
||||||
|
|
||||||
|
## 模式2补充:HDMI采集卡方案
|
||||||
|
|
||||||
本模式适用于服务器安装了视频采集卡,可以接受外部HDMI信号的场景。
|
本模式适用于服务器安装了视频采集卡,可以接受外部HDMI信号的场景。
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user