使用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 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()
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())