Files
meetingroom-netscreen/README.md

7.5 KiB
Raw Blame History

会议投屏系统

项目简介

面向32台终端的内网低延迟屏幕广播系统支持网络投屏、硬件接口互通、一键自动化运维。

需求说明

当前会议投屏需求涉及通过视频矩阵系统向32台终端设备进行同步投屏。具体模式可分为以下两类

  1. 模式1主播投屏单台终端设备作为信号源向MediaMTX服务器投送本地画面流的形式其余31台终端设备读取MediaMTX服务器的流。

    • 特殊情况单独架设1台机器用浏览器读取流然后通过HDMI线将显示画面输出到视频矩阵系统。
  2. 模式2视频会议在MediaMTX服务器上用采集卡和FFmpeg读取设备内容发布流全部32台终端设备用浏览器读取MediaMTX服务器的流。

技术说明上述32台终端设备均通过有线网络实现互联互通。

解决方案

参考文档:https://docs.qq.com/flowchart-addon

整体部署步骤(细化版)

步骤1MediaMTX服务器端

  1. 下载并解压MediaMTX

    • 下载地址:https://github.com/bluenviron/mediamtx/releaseswindows-amd64版
    • 解压到 D:\ScreenCast\mediamtx 目录
  2. 配置MediaMTX

    • 编辑 D:\ScreenCast\mediamtx\mediamtx.yml 文件:
      • 设置 webRTCAddressrtmpAddress
      • 添加 screen 路径配置,暂时不设鉴权
  3. 启动MediaMTX

    • 运行 mediamtx.exe
    • 观察控制台是否监听对应端口
  4. 安装依赖

    • 安装Pythonhttps://www.python.org/downloads/windows/勾选「Add Python to PATH」
    • 安装FFmpeghttps://www.gyan.dev/ffmpeg/builds/ffmpeg-git-full.7z(解压到 D:\ScreenCast\ffmpeg
    • 安装Python依赖管理员cmd执行
      pip install pyautogui requests subprocess32 psutil mss numpy
      
  5. 开启权限

    • 给服务器开启「屏幕录制权限」(设置→隐私和安全性→屏幕录制→允许 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()

观众端:通过浏览器观看

  1. 打开浏览器

    • 在任意观众机上打开 Chrome 浏览器
  2. 访问流地址

    • 输入地址:http://服务器IP:8889/screen
    • MediaMTX 会自动处理 WebRTC 协商,把 RTMP 流转成 WebRTC 给浏览器
    • 确认能看到主播机屏幕画面
  3. 批量部署

    • 在31台终端上运行 auto_receive.py 脚本
    • 脚本会自动打开Chrome并跳转到流地址

特殊情况HDMI矩阵输出

单独架设1台机器通过HDMI线将显示画面输出到视频矩阵系统。

  1. 准备一台小机器

    • 配置要求较低能运行Chrome浏览器即可
  2. 访问流地址

    • 打开浏览器访问:http://服务器IP:8889/screen
  3. HDMI输出到矩阵

    • 通过HDMI线将小机器连接到视频矩阵系统
    • 小机器播放的流画面将输出到矩阵系统

模式2视频会议采集卡 → MediaMTX → 多终端)

在MediaMTX服务器上用采集卡和FFmpeg读取外部视频信号发布流全部32台终端用浏览器观看。

步骤1安装FFmpeg

  • 下载FFmpeghttps://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 服务器 IP192.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信号。

所有32台终端均可通过浏览器访问上述地址观看视频会议内容。

核心文件结构统一放在服务器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台终端、停止所有服务适合管理员操作。