import subprocess import psutil import os import sys import time from loguru import logger from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox, QVBoxLayout, QWidget from PySide6.QtCore import QProcess, Qt logger.add(sys.stderr, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", level="INFO") SERVER_IP = "192.168.1.100" MEDIAMTX_PATH = r"D:\ScreenCast\mediamtx\mediamtx.exe" FFMPEG_PATH = r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe" STREAM_PATH = "screen" def check_mediamtx_running(): logger.info("检查MediaMTX进程是否运行") for proc in psutil.process_iter(['name']): if proc.info['name'] == 'mediamtx.exe': logger.info("MediaMTX进程已运行") return True logger.info("MediaMTX进程未运行") return False def start_mediamtx(): if not check_mediamtx_running(): logger.info("启动MediaMTX服务") subprocess.Popen([MEDIAMTX_PATH], cwd=r"D:\ScreenCast\mediamtx", creationflags=subprocess.CREATE_NEW_CONSOLE) time.sleep(3) logger.info("MediaMTX服务已启动") def push_full_screen(window): logger.info("开始全屏投屏") start_mediamtx() cmd = [ FFMPEG_PATH, "-f", "gdigrab", "-framerate", "30", "-i", "desktop", "-c:v", "libx264", "-preset", "ultrafast", "-tune", "zerolatency", "-f", "rtsp", f"rtsp://{SERVER_IP}:8554/{STREAM_PATH}" ] logger.info(f"执行FFmpeg命令: {' '.join(cmd)}") process = QProcess() process.startDetached(FFMPEG_PATH, cmd[1:]) logger.info("FFmpeg推流已启动") QMessageBox.information(window, "提示", f"全屏投屏已启动!接收端可打开浏览器访问:\nhttp://{SERVER_IP}:8889/webrtc.html?src=screen") class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("投屏源控制") self.setFixedSize(400, 200) central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) self.btn_push = QPushButton("一键全屏投屏") self.btn_push.setFixedHeight(50) self.btn_push.clicked.connect(lambda: push_full_screen(self)) layout.addWidget(self.btn_push) logger.info("投屏源控制界面已初始化") if __name__ == "__main__": logger.info("应用程序启动") app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec())