From b470b4cf4a344e8d574f778cec3cec0634baaad5 Mon Sep 17 00:00:00 2001 From: xiaji Date: Thu, 19 Mar 2026 09:35:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8PySide6=E5=92=8Cloguru?= =?UTF-8?q?=E5=BA=93=E9=87=8D=E5=86=99push=5Fscreen.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- push_screen.py | 120 ++++++++++++++++++++++++++++--------------------- 1 file changed, 70 insertions(+), 50 deletions(-) diff --git a/push_screen.py b/push_screen.py index e7dc176..beba95c 100644 --- a/push_screen.py +++ b/push_screen.py @@ -1,50 +1,70 @@ -import subprocess -import psutil -import os -import time -import tkinter as tk -from tkinter import messagebox - -# 配置项(仅需改这里的服务器IP) -SERVER_IP = "192.168.1.100" # MediaMTX服务器内网IP -MEDIAMTX_PATH = r"D:\ScreenCast\mediamtx\mediamtx.exe" -FFMPEG_PATH = r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe" -STREAM_PATH = "screen" # 投屏流路径(模式1/2) - -# 检查MediaMTX是否运行 -def check_mediamtx_running(): - for proc in psutil.process_iter(['name']): - if proc.info['name'] == 'mediamtx.exe': - return True - return False - -# 启动MediaMTX(如果未运行) -def start_mediamtx(): - if not check_mediamtx_running(): - subprocess.Popen([MEDIAMTX_PATH], cwd=r"D:\ScreenCast\mediamtx", creationflags=subprocess.CREATE_NEW_CONSOLE) - time.sleep(3) # 等待启动 - messagebox.showinfo("提示", "MediaMTX已启动!") - -# 屏幕推流(全屏) -def push_full_screen(): - start_mediamtx() - # 封装FFmpeg命令,低延迟推流 - 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}" - ] - subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE) - messagebox.showinfo("提示", f"全屏投屏已启动!接收端可打开浏览器访问:\n http://{SERVER_IP}:8889/webrtc.html?src=screen ") - -# 主界面(点击按钮即可) -if __name__ == "__main__": - root = tk.Tk() - root.title("投屏源控制") - root.geometry("300x150") - - btn1 = tk.Button(root, text="一键全屏投屏", command=push_full_screen, width=20, height=2) - btn1.pack(pady=20) - - root.mainloop() \ No newline at end of file +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()) \ No newline at end of file