使用PySide6和loguru库重写push_screen.py

This commit is contained in:
2026-03-19 09:35:39 +08:00
parent 80d1c02c4f
commit b470b4cf4a

View File

@@ -1,50 +1,70 @@
import subprocess import subprocess
import psutil import psutil
import os import os
import time import sys
import tkinter as tk import time
from tkinter import messagebox from loguru import logger
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox, QVBoxLayout, QWidget
# 配置项仅需改这里的服务器IP from PySide6.QtCore import QProcess, Qt
SERVER_IP = "192.168.1.100" # MediaMTX服务器内网IP
MEDIAMTX_PATH = r"D:\ScreenCast\mediamtx\mediamtx.exe" logger.add(sys.stderr, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", level="INFO")
FFMPEG_PATH = r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe"
STREAM_PATH = "screen" # 投屏流路径模式1/2 SERVER_IP = "192.168.1.100"
MEDIAMTX_PATH = r"D:\ScreenCast\mediamtx\mediamtx.exe"
# 检查MediaMTX是否运行 FFMPEG_PATH = r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe"
def check_mediamtx_running(): STREAM_PATH = "screen"
for proc in psutil.process_iter(['name']):
if proc.info['name'] == 'mediamtx.exe': def check_mediamtx_running():
return True logger.info("检查MediaMTX进程是否运行")
return False for proc in psutil.process_iter(['name']):
if proc.info['name'] == 'mediamtx.exe':
# 启动MediaMTX如果未运行 logger.info("MediaMTX进程已运行")
def start_mediamtx(): return True
if not check_mediamtx_running(): logger.info("MediaMTX进程未运行")
subprocess.Popen([MEDIAMTX_PATH], cwd=r"D:\ScreenCast\mediamtx", creationflags=subprocess.CREATE_NEW_CONSOLE) return False
time.sleep(3) # 等待启动
messagebox.showinfo("提示", "MediaMTX已启动") def start_mediamtx():
if not check_mediamtx_running():
# 屏幕推流(全屏) logger.info("启动MediaMTX服务")
def push_full_screen(): subprocess.Popen([MEDIAMTX_PATH], cwd=r"D:\ScreenCast\mediamtx", creationflags=subprocess.CREATE_NEW_CONSOLE)
start_mediamtx() time.sleep(3)
# 封装FFmpeg命令低延迟推流 logger.info("MediaMTX服务已启动")
cmd = [
FFMPEG_PATH, def push_full_screen(window):
"-f", "gdigrab", "-framerate", "30", "-i", "desktop", logger.info("开始全屏投屏")
"-c:v", "libx264", "-preset", "ultrafast", "-tune", "zerolatency", start_mediamtx()
"-f", "rtsp", f"rtsp://{SERVER_IP}:8554/{STREAM_PATH}" cmd = [
] FFMPEG_PATH,
subprocess.Popen(cmd, creationflags=subprocess.CREATE_NEW_CONSOLE) "-f", "gdigrab", "-framerate", "30", "-i", "desktop",
messagebox.showinfo("提示", f"全屏投屏已启动!接收端可打开浏览器访问:\n http://{SERVER_IP}:8889/webrtc.html?src=screen ") "-c:v", "libx264", "-preset", "ultrafast", "-tune", "zerolatency",
"-f", "rtsp", f"rtsp://{SERVER_IP}:8554/{STREAM_PATH}"
# 主界面(点击按钮即可) ]
if __name__ == "__main__": logger.info(f"执行FFmpeg命令: {' '.join(cmd)}")
root = tk.Tk() process = QProcess()
root.title("投屏源控制") process.startDetached(FFMPEG_PATH, cmd[1:])
root.geometry("300x150") logger.info("FFmpeg推流已启动")
QMessageBox.information(window, "提示", f"全屏投屏已启动!接收端可打开浏览器访问:\nhttp://{SERVER_IP}:8889/webrtc.html?src=screen")
btn1 = tk.Button(root, text="一键全屏投屏", command=push_full_screen, width=20, height=2)
btn1.pack(pady=20) class MainWindow(QMainWindow):
def __init__(self):
root.mainloop() 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())