From 048179a6b73ad0bdf3dcdf183e8358f191c19ab2 Mon Sep 17 00:00:00 2001 From: xiaji Date: Thu, 19 Mar 2026 13:55:05 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=86=99README=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E4=B8=89=E7=A7=8D=E6=A8=A1=E5=BC=8F=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 66 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 880aced..756febb 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,9 @@ 当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下三类: -1. **模式1**:单台终端设备作为信号源,向其余31台终端设备进行投屏传输。 -2. **模式2**:主控设备同时向31台终端设备传输本地视频信号,并同步接入远程视频会议内容。 -3. **模式3**:视频会议内容直接投屏至全部32台终端设备的显示界面。 +1. **模式1(主播推送)**:主席台的机器推送本机屏幕画面到MediaMTX服务器。 +2. **模式2(网页观看)**:MediaMTX服务器发布流,19台终端通过网页观看流。 +3. **模式3(矩阵输出)**:另外一台小机器通过HDMI线将显示画面输出到视频矩阵系统。 技术说明:上述32台终端设备均通过有线网络实现互联互通。 @@ -20,7 +20,7 @@ ## 整体部署步骤(细化版) -### 步骤1:服务器端 +### 步骤1:MediaMTX服务器端 1. **下载并解压MediaMTX** - 下载地址:`https://github.com/bluenviron/mediamtx/releases`(windows-amd64版) @@ -46,7 +46,9 @@ 5. **开启权限** - 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD) -### 步骤2:主播机 +### 模式1:主播推送(本机屏幕 → MediaMTX) + +主席台机器运行推流脚本,将本机屏幕画面推送到MediaMTX服务器。 **方案A:使用push_screen.py脚本** - 双击运行 `push_screen.py` @@ -67,46 +69,34 @@ WIDTH, HEIGHT = 1280, 720 # 初始化屏幕捕获 with mss.mss() as sct: - # 你可以只抓取部分区域,这里抓整个主显示器 - monitor = sct.monitors[1] # 1 表示主显示器 - # 如果想指定区域,可以改为类似: - # monitor = {"top": 100, "left": 100, "width": 1280, "height": 720} + monitor = sct.monitors[1] # 主显示器 # FFmpeg 命令,编码为 H.264 并推 RTMP command = [ 'ffmpeg', - '-y', # 覆盖输出文件 - '-f', 'rawvideo', # 输入原始视频 + '-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', 'bgr24', + '-s', f'{WIDTH}x{HEIGHT}', + '-r', str(FPS), + '-i', '-', + '-c:v', 'libx264', '-pix_fmt', 'yuv420p', - '-preset', 'ultrafast', # 编码速度优先,延迟低 + '-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 + frame = img[..., :3] process.stdin.write(frame.tobytes()) - # 简单的帧率控制 elapsed = time.time() - last_time sleep_time = (1.0 / FPS) - elapsed if sleep_time > 0: @@ -120,7 +110,9 @@ with mss.mss() as sct: process.wait() ``` -### 步骤3:观众机 +### 模式2:网页观看(MediaMTX → 19台终端) + +MediaMTX服务器发布流,其他终端通过浏览器观看。 1. **打开浏览器** - 在任意观众机上打开 Chrome 浏览器 @@ -131,10 +123,24 @@ with mss.mss() as sct: - 确认能看到主播机屏幕画面 3. **批量部署** - - 在32台终端上运行 `auto_receive.py` 脚本 + - 在19台终端上运行 `auto_receive.py` 脚本 - 脚本会自动打开Chrome并跳转到流地址 -## 模式2:HDMI采集卡方案 +### 模式3:矩阵输出(HDMI → 视频矩阵) + +额外的一台小机器通过HDMI线将显示画面输出到视频矩阵系统。 + +1. **准备一台小机器** + - 配置要求较低,能运行Chrome浏览器即可 + +2. **访问流地址** + - 打开浏览器访问:`http://服务器IP:8889/screen` + +3. **HDMI输出到矩阵** + - 通过HDMI线将小机器连接到视频矩阵系统 + - 小机器播放的流画面将输出到矩阵系统 + +## 模式2补充:HDMI采集卡方案 本模式适用于服务器安装了视频采集卡,可以接受外部HDMI信号的场景。