Files
meetingroom-netscreen/push_screen.py

70 lines
2.4 KiB
Python

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