97 lines
3.9 KiB
Python
97 lines
3.9 KiB
Python
import subprocess
|
||
import psutil
|
||
import time
|
||
import os
|
||
import tkinter as tk
|
||
from tkinter import messagebox
|
||
|
||
# 基础配置
|
||
SERVER_IP = "192.168.1.100"
|
||
MEDIAMTX_PATH = r"D:\ScreenCast\mediamtx\mediamtx.exe"
|
||
FFMPEG_PATH = r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe"
|
||
# 32台终端IP列表(替换为实际终端IP)
|
||
TERMINAL_IPS = [f"192.168.1.{i}" for i in range(11, 43)] # 示例:192.168.1.11~43
|
||
|
||
# 停止所有相关进程
|
||
def stop_all():
|
||
# 停止MediaMTX
|
||
for proc in psutil.process_iter(['name']):
|
||
if proc.info['name'] in ['mediamtx.exe', 'ffmpeg.exe']:
|
||
proc.kill()
|
||
# 停止终端Chrome(可选)
|
||
for ip in TERMINAL_IPS:
|
||
try:
|
||
subprocess.run(f"ssh {ip} taskkill /f /im chrome.exe", shell=True, capture_output=True)
|
||
except:
|
||
pass
|
||
messagebox.showinfo("提示", "所有服务已停止!")
|
||
|
||
# 模式1:1台投屏→31台接收
|
||
def mode1():
|
||
# 启动投屏源推流(本地执行push_screen.py)
|
||
subprocess.Popen(["python", r"D:\ScreenCast\push_screen.py"], creationflags=subprocess.CREATE_NEW_CONSOLE)
|
||
time.sleep(5)
|
||
# 批量启动31台终端接收(排除投屏源IP,比如192.168.1.10)
|
||
for ip in TERMINAL_IPS:
|
||
if ip != "192.168.1.10": # 投屏源IP
|
||
# 远程执行auto_receive.py(需开启终端SSH/共享脚本)
|
||
subprocess.run(f"ssh {ip} python D:\ScreenCast\auto_receive.py screen", shell=True)
|
||
messagebox.showinfo("提示", "模式1已启动:1台投屏→31台接收!")
|
||
|
||
# 模式2:投屏+第三方会议(投屏流→31台+HDMI输出到矩阵)
|
||
def mode2():
|
||
# 启动投屏推流
|
||
subprocess.Popen([
|
||
FFMPEG_PATH,
|
||
"-f", "gdigrab", "-framerate", "30", "-i", "desktop",
|
||
"-c:v", "libx264", "-preset", "ultrafast", "-tune", "zerolatency",
|
||
"-f", "rtsp", f"rtsp://{SERVER_IP}:8554/screen"
|
||
], creationflags=subprocess.CREATE_NEW_CONSOLE)
|
||
# 启动HDMI输出到矩阵(mpv需提前解压到D:\ScreenCast)
|
||
subprocess.Popen([
|
||
r"D:\ScreenCast\mpv.exe",
|
||
f"rtsp://{SERVER_IP}:8554/screen",
|
||
"--vo=direct3d", "--screen=1", "--fullscreen"
|
||
], creationflags=subprocess.CREATE_NEW_CONSOLE)
|
||
# 批量启动31台终端接收
|
||
for ip in TERMINAL_IPS:
|
||
if ip != "192.168.1.10":
|
||
subprocess.run(f"ssh {ip} python D:\ScreenCast\auto_receive.py screen", shell=True)
|
||
messagebox.showinfo("提示", "模式2已启动:投屏→31台+HDMI输出到会议!")
|
||
|
||
# 模式3:会议流→32台接收(采集卡采集会议流)
|
||
def mode3():
|
||
# 采集卡采集矩阵的会议流,推到MediaMTX
|
||
subprocess.Popen([
|
||
FFMPEG_PATH,
|
||
"-f", "dshow", "-i", "video=采集卡设备名称",
|
||
"-c:v", "libx264", "-preset", "ultrafast", "-tune", "zerolatency",
|
||
"-f", "rtsp", f"rtsp://{SERVER_IP}:8554/meeting"
|
||
], creationflags=subprocess.CREATE_NEW_CONSOLE)
|
||
# 批量启动32台终端接收会议流
|
||
for ip in TERMINAL_IPS:
|
||
subprocess.run(f"ssh {ip} python D:\ScreenCast\auto_receive.py meeting", shell=True)
|
||
messagebox.showinfo("提示", "模式3已启动:会议流→32台接收!")
|
||
|
||
# 主界面
|
||
def main():
|
||
root = tk.Tk()
|
||
root.title("会议投屏运维总控")
|
||
root.geometry("400x300")
|
||
|
||
btn1 = tk.Button(root, text="模式1:1台投屏→31台接收", command=mode1, width=30, height=2)
|
||
btn1.pack(pady=10)
|
||
|
||
btn2 = tk.Button(root, text="模式2:投屏+HDMI输出到矩阵", command=mode2, width=30, height=2)
|
||
btn2.pack(pady=10)
|
||
|
||
btn3 = tk.Button(root, text="模式3:会议流→32台接收", command=mode3, width=30, height=2)
|
||
btn3.pack(pady=10)
|
||
|
||
btn4 = tk.Button(root, text="停止所有服务", command=stop_all, width=30, height=2)
|
||
btn4.pack(pady=10)
|
||
|
||
root.mainloop()
|
||
|
||
if __name__ == "__main__":
|
||
main() |