2026-03-19 09:35:39 +08:00
|
|
|
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())
|