Compare commits
3 Commits
bdf1358b0a
...
afba38497b
| Author | SHA1 | Date | |
|---|---|---|---|
| afba38497b | |||
| 41ccd4174e | |||
| cb73725b6c |
3
.gitignore
vendored
3
.gitignore
vendored
@@ -29,4 +29,5 @@ Thumbs.db
|
|||||||
# 构建文件
|
# 构建文件
|
||||||
build/
|
build/
|
||||||
dist/
|
dist/
|
||||||
*.egg-info/
|
*.egg-info/
|
||||||
|
*.spec
|
||||||
@@ -13,9 +13,12 @@ from PySide6.QtWidgets import (QApplication, QMainWindow, QPushButton, QMessageB
|
|||||||
from PySide6.QtCore import Qt, QThread, Signal
|
from PySide6.QtCore import Qt, QThread, Signal
|
||||||
from PySide6.QtGui import QFont
|
from PySide6.QtGui import QFont
|
||||||
|
|
||||||
logger.add(sys.stderr, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", level="INFO")
|
logger.remove()
|
||||||
|
APP_DIR = os.path.dirname(os.path.abspath(sys.executable if getattr(sys, 'frozen', False) else __file__))
|
||||||
|
log_file = os.path.join(APP_DIR, "push_screen.log")
|
||||||
|
logger.add(log_file, format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}", level="INFO", encoding="utf-8")
|
||||||
|
|
||||||
CONFIG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.json")
|
CONFIG_FILE = os.path.join(APP_DIR, "config.json")
|
||||||
|
|
||||||
def load_config():
|
def load_config():
|
||||||
if os.path.exists(CONFIG_FILE):
|
if os.path.exists(CONFIG_FILE):
|
||||||
@@ -23,7 +26,6 @@ def load_config():
|
|||||||
return json.load(f)
|
return json.load(f)
|
||||||
return {
|
return {
|
||||||
"server_ip": "192.168.1.100",
|
"server_ip": "192.168.1.100",
|
||||||
"mediamtx_path": r"D:\ScreenCast\mediamtx\mediamtx.exe",
|
|
||||||
"ffmpeg_path": r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe",
|
"ffmpeg_path": r"D:\ScreenCast\ffmpeg\bin\ffmpeg.exe",
|
||||||
"stream_path": "screen"
|
"stream_path": "screen"
|
||||||
}
|
}
|
||||||
@@ -38,28 +40,22 @@ class ConfigDialog(QDialog):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.config = config
|
self.config = config
|
||||||
self.setWindowTitle("设置")
|
self.setWindowTitle("设置")
|
||||||
self.setFixedSize(450, 220)
|
self.setFixedSize(450, 180)
|
||||||
|
|
||||||
layout = QFormLayout(self)
|
layout = QFormLayout(self)
|
||||||
|
|
||||||
self.server_ip_edit = QLineEdit(config["server_ip"])
|
self.server_ip_edit = QLineEdit(config["server_ip"])
|
||||||
self.mediamtx_path_edit = QLineEdit(config["mediamtx_path"])
|
|
||||||
self.ffmpeg_path_edit = QLineEdit(config["ffmpeg_path"])
|
self.ffmpeg_path_edit = QLineEdit(config["ffmpeg_path"])
|
||||||
self.stream_path_edit = QLineEdit(config["stream_path"])
|
self.stream_path_edit = QLineEdit(config["stream_path"])
|
||||||
|
|
||||||
self.mediamtx_btn = QPushButton("浏览...")
|
|
||||||
self.mediamtx_btn.clicked.connect(lambda: self.browse("mediamtx"))
|
|
||||||
self.ffmpeg_btn = QPushButton("浏览...")
|
self.ffmpeg_btn = QPushButton("浏览...")
|
||||||
self.ffmpeg_btn.clicked.connect(lambda: self.browse("ffmpeg"))
|
self.ffmpeg_btn.clicked.connect(lambda: self.browse("ffmpeg"))
|
||||||
|
|
||||||
path_layout1 = QGridLayout()
|
path_layout1 = QGridLayout()
|
||||||
path_layout1.addWidget(self.mediamtx_path_edit, 0, 0)
|
path_layout1.addWidget(self.ffmpeg_path_edit, 0, 0)
|
||||||
path_layout1.addWidget(self.mediamtx_btn, 0, 1)
|
path_layout1.addWidget(self.ffmpeg_btn, 0, 1)
|
||||||
path_layout1.addWidget(self.ffmpeg_path_edit, 1, 0)
|
|
||||||
path_layout1.addWidget(self.ffmpeg_btn, 1, 1)
|
|
||||||
|
|
||||||
layout.addRow("服务器IP:", self.server_ip_edit)
|
layout.addRow("服务器IP:", self.server_ip_edit)
|
||||||
layout.addRow("MediaMTX路径:", self.mediamtx_path_edit)
|
|
||||||
layout.addRow("FFmpeg路径:", self.ffmpeg_path_edit)
|
layout.addRow("FFmpeg路径:", self.ffmpeg_path_edit)
|
||||||
layout.addRow("推流路径:", self.stream_path_edit)
|
layout.addRow("推流路径:", self.stream_path_edit)
|
||||||
|
|
||||||
@@ -69,11 +65,7 @@ class ConfigDialog(QDialog):
|
|||||||
layout.addRow(buttons)
|
layout.addRow(buttons)
|
||||||
|
|
||||||
def browse(self, field):
|
def browse(self, field):
|
||||||
if field == "mediamtx":
|
if field == "ffmpeg":
|
||||||
path = QFileDialog.getOpenFileName(self, "选择MediaMTX", "", "Executable (*.exe)")[0]
|
|
||||||
if path:
|
|
||||||
self.mediamtx_path_edit.setText(path)
|
|
||||||
elif field == "ffmpeg":
|
|
||||||
path = QFileDialog.getOpenFileName(self, "选择FFmpeg", "", "Executable (*.exe)")[0]
|
path = QFileDialog.getOpenFileName(self, "选择FFmpeg", "", "Executable (*.exe)")[0]
|
||||||
if path:
|
if path:
|
||||||
self.ffmpeg_path_edit.setText(path)
|
self.ffmpeg_path_edit.setText(path)
|
||||||
@@ -81,7 +73,6 @@ class ConfigDialog(QDialog):
|
|||||||
def get_config(self):
|
def get_config(self):
|
||||||
return {
|
return {
|
||||||
"server_ip": self.server_ip_edit.text().strip(),
|
"server_ip": self.server_ip_edit.text().strip(),
|
||||||
"mediamtx_path": self.mediamtx_path_edit.text().strip(),
|
|
||||||
"ffmpeg_path": self.ffmpeg_path_edit.text().strip(),
|
"ffmpeg_path": self.ffmpeg_path_edit.text().strip(),
|
||||||
"stream_path": self.stream_path_edit.text().strip()
|
"stream_path": self.stream_path_edit.text().strip()
|
||||||
}
|
}
|
||||||
@@ -93,7 +84,6 @@ class ConnectionChecker(QThread):
|
|||||||
while True:
|
while True:
|
||||||
cfg = self.config
|
cfg = self.config
|
||||||
status = {
|
status = {
|
||||||
"mediamtx": self.check_mediamtx(cfg["mediamtx_path"]),
|
|
||||||
"ffmpeg": self.check_ffmpeg(cfg["ffmpeg_path"]),
|
"ffmpeg": self.check_ffmpeg(cfg["ffmpeg_path"]),
|
||||||
"server": self.check_server(cfg["server_ip"]),
|
"server": self.check_server(cfg["server_ip"]),
|
||||||
"server_port": self.check_port(cfg["server_ip"], 8554),
|
"server_port": self.check_port(cfg["server_ip"], 8554),
|
||||||
@@ -104,12 +94,6 @@ class ConnectionChecker(QThread):
|
|||||||
def set_config(self, config):
|
def set_config(self, config):
|
||||||
self.config = config
|
self.config = config
|
||||||
|
|
||||||
def check_mediamtx(self, path):
|
|
||||||
for proc in psutil.process_iter(['name']):
|
|
||||||
if proc.info['name'] == 'mediamtx.exe':
|
|
||||||
return True
|
|
||||||
return False
|
|
||||||
|
|
||||||
def check_ffmpeg(self, path):
|
def check_ffmpeg(self, path):
|
||||||
return os.path.exists(path)
|
return os.path.exists(path)
|
||||||
|
|
||||||
@@ -164,13 +148,10 @@ class MainWindow(QMainWindow):
|
|||||||
config_group = QGroupBox("本地配置")
|
config_group = QGroupBox("本地配置")
|
||||||
config_layout = QGridLayout()
|
config_layout = QGridLayout()
|
||||||
|
|
||||||
self.mediamtx_label = QLabel("MediaMTX: 未检测")
|
|
||||||
self.ffmpeg_label = QLabel("FFmpeg: 未检测")
|
self.ffmpeg_label = QLabel("FFmpeg: 未检测")
|
||||||
self.server_label = QLabel("服务器连接: 未检测")
|
self.server_label = QLabel("服务器连接: 未检测")
|
||||||
self.port_label = QLabel("RTSP端口: 未检测")
|
self.port_label = QLabel("RTSP端口: 未检测")
|
||||||
|
|
||||||
self.mediamtx_indicator = QLabel("●")
|
|
||||||
self.mediamtx_indicator.setFixedWidth(20)
|
|
||||||
self.ffmpeg_indicator = QLabel("●")
|
self.ffmpeg_indicator = QLabel("●")
|
||||||
self.ffmpeg_indicator.setFixedWidth(20)
|
self.ffmpeg_indicator.setFixedWidth(20)
|
||||||
self.server_indicator = QLabel("●")
|
self.server_indicator = QLabel("●")
|
||||||
@@ -178,14 +159,12 @@ class MainWindow(QMainWindow):
|
|||||||
self.port_indicator = QLabel("●")
|
self.port_indicator = QLabel("●")
|
||||||
self.port_indicator.setFixedWidth(20)
|
self.port_indicator.setFixedWidth(20)
|
||||||
|
|
||||||
config_layout.addWidget(self.mediamtx_indicator, 0, 0)
|
config_layout.addWidget(self.ffmpeg_indicator, 0, 0)
|
||||||
config_layout.addWidget(self.mediamtx_label, 0, 1)
|
config_layout.addWidget(self.ffmpeg_label, 0, 1)
|
||||||
config_layout.addWidget(self.ffmpeg_indicator, 1, 0)
|
config_layout.addWidget(self.server_indicator, 1, 0)
|
||||||
config_layout.addWidget(self.ffmpeg_label, 1, 1)
|
config_layout.addWidget(self.server_label, 1, 1)
|
||||||
config_layout.addWidget(self.server_indicator, 2, 0)
|
config_layout.addWidget(self.port_indicator, 2, 0)
|
||||||
config_layout.addWidget(self.server_label, 2, 1)
|
config_layout.addWidget(self.port_label, 2, 1)
|
||||||
config_layout.addWidget(self.port_indicator, 3, 0)
|
|
||||||
config_layout.addWidget(self.port_label, 3, 1)
|
|
||||||
|
|
||||||
config_group.setLayout(config_layout)
|
config_group.setLayout(config_layout)
|
||||||
main_layout.addWidget(config_group)
|
main_layout.addWidget(config_group)
|
||||||
@@ -251,13 +230,6 @@ class MainWindow(QMainWindow):
|
|||||||
self.log_label.setText("日志: 配置已更新")
|
self.log_label.setText("日志: 配置已更新")
|
||||||
|
|
||||||
def update_status(self, status):
|
def update_status(self, status):
|
||||||
if status["mediamtx"]:
|
|
||||||
self.mediamtx_indicator.setStyleSheet("color: green; font-size: 16px;")
|
|
||||||
self.mediamtx_label.setText("MediaMTX: ✓ 运行中")
|
|
||||||
else:
|
|
||||||
self.mediamtx_indicator.setStyleSheet("color: red; font-size: 16px;")
|
|
||||||
self.mediamtx_label.setText("MediaMTX: ✗ 未运行")
|
|
||||||
|
|
||||||
if status["ffmpeg"]:
|
if status["ffmpeg"]:
|
||||||
self.ffmpeg_indicator.setStyleSheet("color: green; font-size: 16px;")
|
self.ffmpeg_indicator.setStyleSheet("color: green; font-size: 16px;")
|
||||||
self.ffmpeg_label.setText("FFmpeg: ✓ 已安装")
|
self.ffmpeg_label.setText("FFmpeg: ✓ 已安装")
|
||||||
@@ -279,22 +251,9 @@ class MainWindow(QMainWindow):
|
|||||||
self.port_indicator.setStyleSheet("color: orange; font-size: 16px;")
|
self.port_indicator.setStyleSheet("color: orange; font-size: 16px;")
|
||||||
self.port_label.setText("RTSP端口: ✗ 端口关闭")
|
self.port_label.setText("RTSP端口: ✗ 端口关闭")
|
||||||
|
|
||||||
def start_mediamtx(self):
|
|
||||||
cfg = self.config
|
|
||||||
if not self.checker.check_mediamtx(cfg["mediamtx_path"]):
|
|
||||||
logger.info("启动MediaMTX服务")
|
|
||||||
subprocess.Popen([cfg["mediamtx_path"]], cwd=os.path.dirname(cfg["mediamtx_path"]), creationflags=subprocess.CREATE_NEW_CONSOLE)
|
|
||||||
time.sleep(3)
|
|
||||||
logger.info("MediaMTX服务已启动")
|
|
||||||
self.log_label.setText("日志: MediaMTX服务已启动")
|
|
||||||
else:
|
|
||||||
logger.info("MediaMTX已在运行")
|
|
||||||
self.log_label.setText("日志: MediaMTX已在运行")
|
|
||||||
|
|
||||||
def push_full_screen(self):
|
def push_full_screen(self):
|
||||||
cfg = self.config
|
cfg = self.config
|
||||||
logger.info("开始全屏投屏")
|
logger.info("开始全屏投屏")
|
||||||
self.start_mediamtx()
|
|
||||||
|
|
||||||
if not os.path.exists(cfg["ffmpeg_path"]):
|
if not os.path.exists(cfg["ffmpeg_path"]):
|
||||||
logger.error("FFmpeg未安装")
|
logger.error("FFmpeg未安装")
|
||||||
|
|||||||
Reference in New Issue
Block a user