使用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 psutil
import os
import sys
import time
import tkinter as tk
from tkinter import messagebox
from loguru import logger
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QMessageBox, QVBoxLayout, QWidget
from PySide6.QtCore import QProcess, Qt
# 配置项仅需改这里的服务器IP
SERVER_IP = "192.168.1.100" # MediaMTX服务器内网IP
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" # 投屏流路径模式1/2
STREAM_PATH = "screen"
# 检查MediaMTX是否运行
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
# 启动MediaMTX如果未运行
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) # 等待启动
messagebox.showinfo("提示", "MediaMTX已启动")
time.sleep(3)
logger.info("MediaMTX服务已启动")
# 屏幕推流(全屏)
def push_full_screen():
def push_full_screen(window):
logger.info("开始全屏投屏")
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 ")
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__":
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()
logger.info("应用程序启动")
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())