Initial commit for tst

This commit is contained in:
2026-02-08 14:33:45 +08:00
parent bb01265fb1
commit 505cfe929d
27 changed files with 5855 additions and 0 deletions

183
AIMonitor/start.py Normal file
View File

@@ -0,0 +1,183 @@
#!/usr/bin/env python3
"""
AI监控系统启动脚本
启动RTSP视频流处理服务和静态文件服务
"""
import os
import sys
import time
import signal
import subprocess
import threading
from pathlib import Path
class AIMonitorLauncher:
def __init__(self):
self.processes = []
self.base_dir = Path(__file__).parent
def check_requirements(self):
"""检查依赖是否安装"""
print("正在检查依赖...")
try:
import cv2
import yaml
import websockets
import flask
print("✓ 依赖检查通过")
return True
except ImportError as e:
print(f"✗ 缺少依赖: {e}")
print("请运行: pip install -r requirements.txt")
return False
def check_config(self):
"""检查配置文件"""
config_file = self.base_dir / "config.yaml"
if not config_file.exists():
print(f"✗ 配置文件不存在: {config_file}")
return False
print("✓ 配置文件检查通过")
return True
def start_rtsp_service(self):
"""启动RTSP服务"""
print("正在启动RTSP视频流处理服务...")
rtsp_script = self.base_dir / "rtsp_service_ws.py"
try:
process = subprocess.Popen(
[sys.executable, str(rtsp_script)],
cwd=str(self.base_dir),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
bufsize=1
)
# 启动线程监控输出
def monitor_output():
for line in iter(process.stdout.readline, ''):
if line.strip():
print(f"[RTSP] {line.strip()}")
monitor_thread = threading.Thread(target=monitor_output, daemon=True)
monitor_thread.start()
self.processes.append(("RTSP服务", process))
print(f"✓ RTSP服务已启动 (PID: {process.pid})")
return True
except Exception as e:
print(f"✗ 启动RTSP服务失败: {e}")
return False
def start_static_server(self):
"""启动静态文件服务"""
print("正在启动静态文件服务...")
static_script = self.base_dir / "static_server.py"
try:
process = subprocess.Popen(
[sys.executable, str(static_script)],
cwd=str(self.base_dir),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True,
bufsize=1
)
# 启动线程监控输出
def monitor_output():
for line in iter(process.stdout.readline, ''):
if line.strip():
print(f"[HTTP] {line.strip()}")
monitor_thread = threading.Thread(target=monitor_output, daemon=True)
monitor_thread.start()
self.processes.append(("HTTP服务", process))
print(f"✓ HTTP服务已启动 (PID: {process.pid})")
return True
except Exception as e:
print(f"✗ 启动HTTP服务失败: {e}")
return False
def signal_handler(self, signum, frame):
"""处理退出信号"""
print("\n正在关闭服务...")
self.stop_all()
sys.exit(0)
def stop_all(self):
"""停止所有服务"""
for name, process in self.processes:
try:
process.terminate()
process.wait(timeout=5)
print(f"{name}已停止")
except subprocess.TimeoutExpired:
process.kill()
print(f"{name}强制停止")
except Exception as e:
print(f"✗ 停止{name}失败: {e}")
def run(self):
"""主运行函数"""
print("=== AI监控系统启动器 ===")
# 注册信号处理
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
# 检查环境
if not self.check_requirements():
return False
if not self.check_config():
return False
# 启动服务
services_started = 0
if self.start_rtsp_service():
services_started += 1
time.sleep(2) # 等待RTSP服务完全启动
if self.start_static_server():
services_started += 1
if services_started == 0:
print("✗ 没有服务启动成功")
return False
print(f"\n=== 系统启动完成 ({services_started}/2 服务) ===")
print("RTSP WebSocket服务: ws://localhost:8765")
print("静态文件服务: http://localhost:5000")
print("按 Ctrl+C 停止所有服务")
try:
# 等待进程
while True:
time.sleep(1)
# 检查进程状态
for name, process in self.processes:
if process.poll() is not None:
print(f"{name}异常退出,返回码: {process.returncode}")
self.stop_all()
return False
except KeyboardInterrupt:
self.signal_handler(signal.SIGINT, None)
return True
def main():
launcher = AIMonitorLauncher()
launcher.run()
if __name__ == "__main__":
main()