7.2 KiB
7.2 KiB
会议投屏系统
项目简介
面向32台终端的内网低延迟屏幕广播系统,支持网络投屏、硬件接口互通、一键自动化运维。
需求说明
当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下三类:
- 模式1(主播推送):主席台的机器推送本机屏幕画面到MediaMTX服务器。
- 模式2(网页观看):MediaMTX服务器发布流,19台终端通过网页观看流。
- 模式3(矩阵输出):另外一台小机器通过HDMI线将显示画面输出到视频矩阵系统。
技术说明:上述32台终端设备均通过有线网络实现互联互通。
解决方案
参考文档:https://docs.qq.com/flowchart-addon
整体部署步骤(细化版)
步骤1:MediaMTX服务器端
-
下载并解压MediaMTX
- 下载地址:
https://github.com/bluenviron/mediamtx/releases(windows-amd64版) - 解压到
D:\ScreenCast\mediamtx目录
- 下载地址:
-
配置MediaMTX
- 编辑
D:\ScreenCast\mediamtx\mediamtx.yml文件:- 设置
webRTCAddress和rtmpAddress - 添加
screen路径配置,暂时不设鉴权
- 设置
- 编辑
-
启动MediaMTX
- 运行
mediamtx.exe - 观察控制台是否监听对应端口
- 运行
-
安装依赖
- 安装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
- 安装Python:
-
开启权限
- 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 Python/CMD)
模式1:主播推送(本机屏幕 → MediaMTX)
主席台机器运行推流脚本,将本机屏幕画面推送到MediaMTX服务器。
方案A:使用push_screen.py脚本
- 双击运行
push_screen.py - 点击「一键全屏投屏」按钮
- 脚本会自动启动MediaMTX并开始推流
方案B:使用mss抓屏+FFmpeg推流
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] # 主显示器
# FFmpeg 命令,编码为 H.264 并推 RTMP
command = [
'ffmpeg',
'-y',
'-f', 'rawvideo',
'-vcodec', 'rawvideo',
'-pix_fmt', 'bgr24',
'-s', f'{WIDTH}x{HEIGHT}',
'-r', str(FPS),
'-i', '-',
'-c:v', 'libx264',
'-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))
frame = img[..., :3]
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()
模式2:网页观看(MediaMTX → 19台终端)
MediaMTX服务器发布流,其他终端通过浏览器观看。
-
打开浏览器
- 在任意观众机上打开 Chrome 浏览器
-
访问流地址
- 输入地址:
http://服务器IP:8889/screen - MediaMTX 会自动处理 WebRTC 协商,把 RTMP 流转成 WebRTC 给浏览器
- 确认能看到主播机屏幕画面
- 输入地址:
-
批量部署
- 在19台终端上运行
auto_receive.py脚本 - 脚本会自动打开Chrome并跳转到流地址
- 在19台终端上运行
模式3:矩阵输出(HDMI → 视频矩阵)
额外的一台小机器通过HDMI线将显示画面输出到视频矩阵系统。
-
准备一台小机器
- 配置要求较低,能运行Chrome浏览器即可
-
访问流地址
- 打开浏览器访问:
http://服务器IP:8889/screen
- 打开浏览器访问:
-
HDMI输出到矩阵
- 通过HDMI线将小机器连接到视频矩阵系统
- 小机器播放的流画面将输出到矩阵系统
模式2补充:HDMI采集卡方案
本模式适用于服务器安装了视频采集卡,可以接受外部HDMI信号的场景。
步骤1:安装FFmpeg
- 下载FFmpeg:
https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z - 解压到
D:\ScreenCast\ffmpeg目录 - 确保
D:\ScreenCast\ffmpeg\bin\ffmpeg.exe可用
步骤2:列出DirectShow设备
在命令行执行以下命令,列出所有 DirectShow 设备:
ffmpeg -list_devices true -f dshow -i dummy
输出示例:
[dshow @ ...] DirectShow video devices
[dshow @ ...] "USB Video Device"
[dshow @ ...] "AVerMedia HD Capture"
记下要使用的设备名称。
步骤3:配置MediaMTX
编辑 mediamtx.yml,添加 hdmi 路径配置:
paths:
hdmi:
# source 不写,或者写 publisher,表示"由客户端推流进来"
# source: publisher
# 局域网可以先不开认证
# publishUser: ""
# publishPass: ""
# 有读者时才拉源(这里用不到,因为是 publisher 模式)
sourceOnDemand: no
步骤4:启动MediaMTX
./mediamtx
看到日志里 RTMP/RTSP/WebRTC 端口监听就表示启动成功。
步骤5:用FFmpeg采集采集卡并推流
假设:
- MediaMTX 服务器 IP:192.168.1.100
- 推流路径名:hdmi
- DirectShow 设备名称:"AVerMedia HD Capture"
ffmpeg -f dshow -i video="AVerMedia HD Capture" ^
-c:v libx264 -preset ultrafast -tune zerolatency ^
-profile:v baseline -pix_fmt yuv420p ^
-b:v 4000k -maxrate 4000k -bufsize 8000k ^
-g 30 ^
-f flv rtmp://192.168.1.100/hdmi
步骤6:客户端观看
在浏览器中直接访问:
http://192.168.1.100:8889/hdmi
MediaMTX 会返回内置的 WebRTC 播放页面,浏览器会自动播放HDMI信号。
核心文件结构(统一放在服务器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台终端、停止所有服务),适合管理员操作。