初始化项目:添加README和核心Python脚本
This commit is contained in:
97
manage_server.py
Normal file
97
manage_server.py
Normal file
@@ -0,0 +1,97 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user