diff --git a/docs/requirements/guide.md b/docs/requirements/guide.md new file mode 100644 index 0000000..185ec31 --- /dev/null +++ b/docs/requirements/guide.md @@ -0,0 +1,12 @@ +# 命令指南 + +[在windows上安装ffmpeg] + +- 打开 PowerShell 或 CMD,执行: +winget install Gyan.FFmpeg + +- 安装完成后,关闭并重新打开终端,验证: +ffmpeg -version + +- 推流到RTSP服务器(设置摄像头的分辨率为720P) +ffmpeg -f dshow -rtbufsize 100M -video_size 1280x720 -framerate 30 -vcodec mjpeg -i video="4K AutoFocus Webcam" -c:v libx264 -preset ultrafast -pix_fmt yuv420p -f rtsp rtsp://localhost:8554/cam \ No newline at end of file diff --git a/scripts/systemd/Mannual.md b/scripts/systemd/Mannual.md deleted file mode 100644 index f66a96d..0000000 --- a/scripts/systemd/Mannual.md +++ /dev/null @@ -1,284 +0,0 @@ -# RK3588 Media Server Systemd 集成 - -本目录包含 RK3588 Media Server 和 Agent 的 systemd 服务配置和管理脚本。 - -## 概述 - -| 服务 | 描述 | 默认端口 | -|------|------|----------| -| `media-server` | C++ 媒体服务器(视频流处理) | 9000 (HTTP), 8554/8555 (RTSP) | -| `rk3588-agent` | Go 管理代理(HTTP API) | 9100 | - -## 快速开始 - -### 方法一:快速设置(推荐用于开发板) - -如果你已经在 Orange Pi 上编译好项目,直接运行: - -```bash -cd /path/to/OrangePi3588Media -sudo ./scripts/systemd/quick-setup.sh -``` - -此脚本会自动: - -1. 检查并编译项目(如需要) -2. 安装 systemd 服务 -3. 启动服务 -4. 显示访问地址 - -### 方法二:手动安装 - -```bash -cd /path/to/OrangePi3588Media - -# 安装服务 -sudo ./scripts/systemd/install-systemd.sh - -# 或指定自定义路径 -sudo ./scripts/systemd/install-systemd.sh \ - --media-bin ./build/media-server \ - --media-config ./configs/sample_cam1.json \ - --agent-bin ./agent/rk3588-agent_linux_arm64 \ - --agent-config ./agent/agent_cam1.config.json -``` - -### 方法三:手动步骤(了解细节) - -```bash -# 1. 复制服务文件 -sudo cp scripts/systemd/media-server.service /etc/systemd/system/ -sudo cp scripts/systemd/rk3588-agent.service /etc/systemd/system/ - -# 2. 创建安装目录并复制文件 -sudo mkdir -p /opt/rk3588-media-server/{bin,lib,etc,logs} -sudo cp build/media-server /opt/rk3588-media-server/bin/ -sudo cp configs/sample_cam1.json /opt/rk3588-media-server/etc/media-server.json - -sudo mkdir -p /opt/rk3588-agent -sudo cp agent/rk3588-agent_linux_arm64 /opt/rk3588-agent/rk3588-agent -sudo cp agent/agent_cam1.config.json /opt/rk3588-agent/agent.config.json - -# 3. 重载 systemd -sudo systemctl daemon-reload - -# 4. 启动并启用服务 -sudo systemctl enable --now media-server -sudo systemctl enable --now rk3588-agent -``` - -## 服务管理 - -### 查看状态 - -```bash -# 使用便捷脚本 -./scripts/systemd/status.sh - -# 或手动查看 -sudo systemctl status media-server -sudo systemctl status rk3588-agent - -# 查看 NPU 负载 -sudo watch -n 1 cat /sys/kernel/debug/rknpu/load -``` - -### 启动/停止/重启 - -```bash -# Media Server -sudo systemctl start media-server -sudo systemctl stop media-server -sudo systemctl restart media-server - -# Agent -sudo systemctl start rk3588-agent -sudo systemctl stop rk3588-agent -sudo systemctl restart rk3588-agent - -# 同时重启两者 -sudo systemctl restart media-server rk3588-agent -``` - -### 开机自启 - -```bash -# 启用开机自启 -sudo systemctl enable media-server -sudo systemctl enable rk3588-agent - -# 禁用开机自启 -sudo systemctl disable media-server -sudo systemctl disable rk3588-agent -``` - -### 查看日志 - -```bash -# 实时跟踪日志 -sudo journalctl -u media-server -f -sudo journalctl -u rk3588-agent -f - -# 查看最近 100 行 -sudo journalctl -u media-server -n 100 --no-pager - -# 查看今天的日志 -sudo journalctl -u media-server --since today - -# 按时间范围查看 -sudo journalctl -u media-server --since "2024-01-01 10:00:00" --until "2024-01-01 12:00:00" -``` - -## 配置文件 - -### Media Server - -位置: `/opt/rk3588-media-server/etc/media-server.json` - -```bash -# 编辑配置 -sudo nano /opt/rk3588-media-server/etc/media-server.json - -# 验证 JSON 格式 -python3 -m json.tool /opt/rk3588-media-server/etc/media-server.json - -# 重启生效 -sudo systemctl restart media-server -``` - -### Agent - -位置: `/opt/rk3588-agent/agent.config.json` - -```bash -sudo nano /opt/rk3588-agent/agent.config.json -sudo systemctl restart rk3588-agent -``` - -## 卸载 - -```bash -# 使用卸载脚本(保留配置备份) -sudo ./scripts/systemd/uninstall-systemd.sh - -# 或手动卸载 -sudo systemctl stop media-server rk3588-agent -sudo systemctl disable media-server rk3588-agent -sudo rm -f /etc/systemd/system/media-server.service -sudo rm -f /etc/systemd/system/rk3588-agent.service -sudo systemctl daemon-reload -# 然后手动删除 /opt/rk3588-media-server/ 和 /opt/rk3588-agent/ -``` - -## 故障排查 - -### 服务无法启动 - -```bash -# 1. 查看详细错误信息 -sudo journalctl -u media-server -n 50 --no-pager - -# 2. 检查配置文件 -sudo /opt/rk3588-media-server/bin/media-server --config /opt/rk3588-media-server/etc/media-server.json --version - -# 3. 检查端口占用 -sudo ss -tlnp | grep -E '(9000|8554|8555|9100)' - -# 4. 检查权限 -ls -la /opt/rk3588-media-server/bin/media-server -``` - -### 端口冲突 - -如果 9000/8554/8555 端口被占用,修改配置文件: - -```json -// media-server.json -{ - "http": { - "port": 9001 // 修改为其他端口 - }, - "rtsp": { - "port": 8556 // 修改为其他端口 - } -} -``` - -### NPU 相关问题 - -```bash -# 检查 NPU 驱动 -cat /sys/kernel/debug/rknpu/version - -# 检查 NPU 负载 -watch -n 1 cat /sys/kernel/debug/rknpu/load - -# 检查设备节点 -ls -la /dev/rknpu* -``` - -## 文件说明 - -``` -scripts/systemd/ -├── README.md # 本文件 -├── media-server.service # Media Server systemd 服务文件 -├── rk3588-agent.service # Agent systemd 服务文件 -├── install-systemd.sh # 安装脚本 -├── uninstall-systemd.sh # 卸载脚本 -├── status.sh # 状态查看脚本 -└── quick-setup.sh # 快速设置脚本(一键部署) -``` - -## 服务文件详解 - -### media-server.service - -```ini -[Unit] -Description=RK3588 Media Server -After=network-online.target - -[Service] -Type=simple -User=root -ExecStart=/opt/rk3588-media-server/bin/media-server --config /opt/rk3588-media-server/etc/media-server.json -Restart=on-failure -RestartSec=5 -LimitNOFILE=65535 - -[Install] -WantedBy=multi-user.target -``` - -关键配置: - -- `Restart=on-failure`: 崩溃后自动重启 -- `LimitNOFILE=65535`: 增加文件描述符限制(视频流需要) -- `After=network-online.target`: 确保网络就绪后启动 - -### rk3588-agent.service - -```ini -[Unit] -Description=RK3588 Agent -After=media-server.service # 可选:确保 media-server 先启动 - -[Service] -Type=simple -ExecStart=/opt/rk3588-agent/rk3588-agent --config /opt/rk3588-agent/agent.config.json -Restart=always -RestartSec=2 -``` - -## 注意事项 - -1. **首次启动**: 确保配置文件路径正确,特别是模型路径和摄像头配置 -2. **权限**: 服务以 root 运行,需要访问 `/dev/rknpu` 设备 -3. **依赖**: Agent 可选依赖 media-server,可根据需要调整 `After=` 和 `Requires=` -4. **日志**: 使用 `journalctl` 查看日志,日志大小由 systemd 管理 - -## 参考 - -- [命令.md](../../docs/命令.md) - 开发和部署命令参考 -- [API_Device_RemoteMgmt_InterfaceTable.md](../../API_Device_RemoteMgmt_InterfaceTable.md) - Agent API 文档 diff --git a/scripts/systemd/README.md b/scripts/systemd/README.md new file mode 100644 index 0000000..a5bbb14 --- /dev/null +++ b/scripts/systemd/README.md @@ -0,0 +1,150 @@ +# RK3588 Media Server Systemd 部署脚本 + +本目录包含 RK3588 Media Server 的完整 systemd 部署方案,适用于 Orange Pi 5 Plus。 + +## 文件说明 + +| 文件 | 用途 | +|------|------| +| `install.sh` | **主安装脚本** - 一键安装media-server到systemd | +| `uninstall.sh` | 卸载脚本 | +| `status.sh` | 状态查看脚本 | +| `media-server.service` | Systemd服务文件 | +| `rk3588-agent.service` | Agent服务文件(可选) | + +## 快速开始 + +### 1. 编译项目 + +确保已编译项目: + +```bash +cd /path/to/OrangePi3588Media +cmake -S . -B build \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_TESTS=OFF \ + -DRK3588_ENABLE_FFMPEG=ON \ + -DRK3588_ENABLE_MPP=ON \ + -DRK3588_ENABLE_RGA=ON \ + -DRK3588_ENABLE_RKNN=ON +cmake --build build -j$(nproc) +``` + +### 2. 安装服务 + +```bash +cd /path/to/OrangePi3588Media +sudo ./scripts/systemd/install.sh +``` + +安装脚本会: +1. 自动选择配置文件(推荐用 `test_cam1_face_det_rtsp_server.json`) +2. 复制主程序和**所有插件**到 `/opt/rk3588-media-server/` +3. 复制模型文件 +4. **自动修复配置文件**(处理路径、禁用无输入的gate节点) +5. 安装并启动systemd服务 + +### 3. 修改RTSP源地址 + +编辑配置文件,修改为你的RTSP源: + +```bash +sudo nano /opt/rk3588-media-server/etc/media-server.json +``` + +找到 `"url": "rtsp://..."`,改成你的摄像头/推流地址。 + +### 4. 管理服务 + +```bash +# 查看状态 +sudo ./scripts/systemd/status.sh + +# 或手动管理 +sudo systemctl start media-server # 启动 +sudo systemctl stop media-server # 停止 +sudo systemctl restart media-server # 重启 +sudo systemctl status media-server # 查看状态 + +# 查看日志 +sudo journalctl -u media-server -f # 实时跟踪 +sudo journalctl -u media-server -n 100 # 最近100行 +``` + +## 目录结构 + +安装后的目录结构: + +``` +/opt/rk3588-media-server/ +├── bin/ +│ ├── media-server # 主程序 +│ └── plugins/ # 插件目录 +│ ├── libinput_rtsp.so +│ ├── libpublish.so +│ ├── libpreprocess.so +│ ├── libai_yolo.so +│ └── ... +├── lib/ # 依赖库 +├── etc/ +│ └── media-server.json # 配置文件 +├── models/ # 模型文件 +│ ├── yolov5s-640-640.rknn +│ └── ... +├── web/hls/ # HLS输出目录 +└── logs/ # 日志目录 +``` + +## 故障排查 + +### 服务启动失败 + +```bash +# 1. 查看详细错误 +sudo journalctl -u media-server -n 50 --no-pager + +# 2. 检查插件是否存在 +ls -la /opt/rk3588-media-server/bin/plugins/ + +# 3. 检查模型文件 +ls -la /opt/rk3588-media-server/models/ + +# 4. 直接运行看错误 +sudo /opt/rk3588-media-server/bin/media-server --config /opt/rk3588-media-server/etc/media-server.json +``` + +### 常见错误 + +**错误1**: `Failed to load plugin 'input_rtsp': ... No such file or directory` +- 原因:插件未复制 +- 解决:重新运行 `sudo ./scripts/systemd/install.sh` + +**错误2**: `Node gate_face_cam1 role=filter must have input` +- 原因:配置文件中的gate节点没有输入连接 +- 解决:安装时选择 `test_cam1_face_det_rtsp_server.json`(选项1),或手动禁用该节点 + +**错误3**: `Failed to open input: Connection refused` +- 原因:RTSP源无法连接 +- 解决:检查RTSP源地址和端口 + +## 卸载 + +```bash +sudo ./scripts/systemd/uninstall.sh +``` + +会保留配置备份到 `/root/rk3588-backup-xxx/`。 + +## 更新配置 + +修改配置后重启服务: + +```bash +sudo nano /opt/rk3588-media-server/etc/media-server.json +sudo systemctl restart media-server +``` + +## 相关文档 + +- [命令.md](../../docs/命令.md) - 开发和部署命令参考 +- [API_Device_RemoteMgmt_InterfaceTable.md](../../API_Device_RemoteMgmt_InterfaceTable.md) - Agent API文档 diff --git a/scripts/systemd/install-systemd.sh b/scripts/systemd/install-systemd.sh deleted file mode 100644 index 0d3377a..0000000 --- a/scripts/systemd/install-systemd.sh +++ /dev/null @@ -1,271 +0,0 @@ -#!/bin/bash -# RK3588 Media Server & Agent Systemd 服务安装脚本 -# 适用于 Orange Pi 5 Plus (RK3588) - -set -e - -# 颜色定义 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# 默认路径 -MEDIA_SERVER_BIN="${MEDIA_SERVER_BIN:-$(pwd)/build/media-server}" -AGENT_BIN="${AGENT_BIN:-$(pwd)/agent/rk3588-agent_linux_arm64}" -MEDIA_SERVER_CONFIG="${MEDIA_SERVER_CONFIG:-$(pwd)/configs/sample_cam1.json}" -AGENT_CONFIG="${AGENT_CONFIG:-$(pwd)/agent/agent_cam1.config.json}" - -INSTALL_DIR="/opt" -SERVICE_DIR="/etc/systemd/system" - -echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" -echo -e "${BLUE}║ RK3588 Media Server & Agent Systemd 安装 ║${NC}" -echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" -echo "" - -# 检查 root 权限 -if [ "$EUID" -ne 0 ]; then - echo -e "${RED}错误: 请使用 sudo 运行此脚本${NC}" - exit 1 -fi - -# 检查 systemd -if ! command -v systemctl &> /dev/null; then - echo -e "${RED}错误: 未找到 systemctl,此系统可能不支持 systemd${NC}" - exit 1 -fi - -# 函数:安装 media-server -install_media_server() { - echo -e "${YELLOW}[1/6] 安装 Media Server...${NC}" - - # 检查二进制文件 - if [ ! -f "$MEDIA_SERVER_BIN" ]; then - echo -e "${RED}错误: 未找到 media-server 二进制文件: $MEDIA_SERVER_BIN${NC}" - echo "请确认已编译,或设置 MEDIA_SERVER_BIN 环境变量" - return 1 - fi - - # 创建目录 - mkdir -p "$INSTALL_DIR/rk3588-media-server"/{bin,lib,etc,logs} - - # 复制二进制文件 - cp "$MEDIA_SERVER_BIN" "$INSTALL_DIR/rk3588-media-server/bin/" - chmod +x "$INSTALL_DIR/rk3588-media-server/bin/media-server" - - # 复制依赖库(如果有) - if [ -d "$(dirname $MEDIA_SERVER_BIN)/../lib" ]; then - cp -r "$(dirname $MEDIA_SERVER_BIN)/../lib"/* "$INSTALL_DIR/rk3588-media-server/lib/" 2>/dev/null || true - fi - - # 复制或创建配置文件 - if [ -f "$MEDIA_SERVER_CONFIG" ]; then - cp "$MEDIA_SERVER_CONFIG" "$INSTALL_DIR/rk3588-media-server/etc/media-server.json" - echo -e "${GREEN}✓${NC} 配置文件: $INSTALL_DIR/rk3588-media-server/etc/media-server.json" - else - echo -e "${YELLOW}⚠ 未找到配置文件,请手动创建: $INSTALL_DIR/rk3588-media-server/etc/media-server.json${NC}" - fi - - # 安装服务文件 - cp "$(dirname $0)/media-server.service" "$SERVICE_DIR/" - - echo -e "${GREEN}✓${NC} Media Server 安装完成" -} - -# 函数:安装 agent -install_agent() { - echo -e "${YELLOW}[2/6] 安装 RK3588 Agent...${NC}" - - # 检查二进制文件 - if [ ! -f "$AGENT_BIN" ]; then - # 尝试其他可能的名称 - if [ -f "$(dirname $AGENT_BIN)/rk3588-agent" ]; then - AGENT_BIN="$(dirname $AGENT_BIN)/rk3588-agent" - else - echo -e "${YELLOW}⚠ 未找到 Agent 二进制文件,跳过 Agent 安装${NC}" - return 0 - fi - fi - - # 创建目录 - mkdir -p "$INSTALL_DIR/rk3588-agent"/{logs,models} - - # 复制二进制文件 - cp "$AGENT_BIN" "$INSTALL_DIR/rk3588-agent/rk3588-agent" - chmod +x "$INSTALL_DIR/rk3588-agent/rk3588-agent" - - # 复制或创建配置文件 - if [ -f "$AGENT_CONFIG" ]; then - cp "$AGENT_CONFIG" "$INSTALL_DIR/rk3588-agent/agent.config.json" - echo -e "${GREEN}✓${NC} 配置文件: $INSTALL_DIR/rk3588-agent/agent.config.json" - else - echo -e "${YELLOW}⚠ 未找到 Agent 配置文件,请手动创建${NC}" - fi - - # 安装服务文件 - cp "$(dirname $0)/rk3588-agent.service" "$SERVICE_DIR/" - - echo -e "${GREEN}✓${NC} RK3588 Agent 安装完成" -} - -# 函数:重载 systemd -reload_systemd() { - echo -e "${YELLOW}[3/6] 重载 systemd...${NC}" - systemctl daemon-reload - echo -e "${GREEN}✓${NC} systemd 已重载" -} - -# 函数:启动服务 -start_services() { - echo -e "${YELLOW}[4/6] 启动服务...${NC}" - - # 启动 media-server - if [ -f "$SERVICE_DIR/media-server.service" ]; then - echo " 启动 media-server..." - systemctl enable media-server - systemctl start media-server - sleep 2 - if systemctl is-active --quiet media-server; then - echo -e "${GREEN}✓${NC} media-server 运行中" - else - echo -e "${RED}✗${NC} media-server 启动失败,请检查日志" - fi - fi - - # 启动 agent - if [ -f "$SERVICE_DIR/rk3588-agent.service" ] && [ -f "$INSTALL_DIR/rk3588-agent/rk3588-agent" ]; then - echo " 启动 rk3588-agent..." - systemctl enable rk3588-agent - systemctl start rk3588-agent - sleep 1 - if systemctl is-active --quiet rk3588-agent; then - echo -e "${GREEN}✓${NC} rk3588-agent 运行中" - else - echo -e "${RED}✗${NC} rk3588-agent 启动失败,请检查日志" - fi - fi -} - -# 函数:显示状态 -show_status() { - echo -e "${YELLOW}[5/6] 服务状态...${NC}" - echo "" - - if [ -f "$SERVICE_DIR/media-server.service" ]; then - echo -e "${BLUE}Media Server:${NC}" - systemctl status media-server --no-pager | head -5 - echo "" - fi - - if [ -f "$SERVICE_DIR/rk3588-agent.service" ]; then - echo -e "${BLUE}RK3588 Agent:${NC}" - systemctl status rk3588-agent --no-pager | head -5 - echo "" - fi -} - -# 函数:显示使用说明 -show_usage() { - echo -e "${YELLOW}[6/6] 使用说明${NC}" - echo "" - echo "┌─────────────────────────────────────────────────────────────┐" - echo "│ 管理命令 │" - echo "├─────────────────────────────────────────────────────────────┤" - echo "│ 查看状态 │" - echo "│ systemctl status media-server │" - echo "│ systemctl status rk3588-agent │" - echo "│ │" - echo "│ 启动/停止/重启 │" - echo "│ systemctl start media-server │" - echo "│ systemctl stop media-server │" - echo "│ systemctl restart media-server │" - echo "│ │" - echo "│ 开机自启 │" - echo "│ systemctl enable media-server # 启用 │" - echo "│ systemctl disable media-server # 禁用 │" - echo "│ │" - echo "│ 查看日志 │" - echo "│ journalctl -u media-server -f # 实时跟踪 │" - echo "│ journalctl -u media-server -n 100 # 最近100行 │" - echo "│ journalctl -u rk3588-agent -f │" - echo "│ │" - echo "│ 文件位置 │" - echo "│ 安装目录: /opt/rk3588-media-server/ │" - echo "│ 配置文件: /opt/rk3588-media-server/etc/media-server.json │" - echo "│ Agent目录: /opt/rk3588-agent/ │" - echo "│ Agent配置: /opt/rk3588-agent/agent.config.json │" - echo "└─────────────────────────────────────────────────────────────┘" -} - -# 主流程 -main() { - # 如果传入了参数,解析环境变量 - while [[ $# -gt 0 ]]; do - case $1 in - --media-bin) - MEDIA_SERVER_BIN="$2" - shift 2 - ;; - --agent-bin) - AGENT_BIN="$2" - shift 2 - ;; - --media-config) - MEDIA_SERVER_CONFIG="$2" - shift 2 - ;; - --agent-config) - AGENT_CONFIG="$2" - shift 2 - ;; - --help|-h) - echo "用法: $0 [选项]" - echo "" - echo "选项:" - echo " --media-bin <路径> Media Server 二进制文件路径" - echo " --agent-bin <路径> Agent 二进制文件路径" - echo " --media-config <路径> Media Server 配置文件路径" - echo " --agent-config <路径> Agent 配置文件路径" - echo "" - echo "环境变量:" - echo " MEDIA_SERVER_BIN Media Server 二进制文件路径" - echo " AGENT_BIN Agent 二进制文件路径" - echo " MEDIA_SERVER_CONFIG Media Server 配置文件路径" - echo " AGENT_CONFIG Agent 配置文件路径" - exit 0 - ;; - *) - echo "未知选项: $1" - exit 1 - ;; - esac - done - - echo "安装路径: $INSTALL_DIR" - echo "Media Server: $MEDIA_SERVER_BIN" - echo "Agent: $AGENT_BIN" - echo "" - - read -p "确认安装? (y/N): " -n 1 -r - echo - if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "安装已取消" - exit 0 - fi - - install_media_server - install_agent - reload_systemd - start_services - show_status - show_usage - - echo "" - echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}" - echo -e "${GREEN}║ 安装完成! ║${NC}" - echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}" -} - -main "$@" diff --git a/scripts/systemd/install.sh b/scripts/systemd/install.sh new file mode 100644 index 0000000..992b9ef --- /dev/null +++ b/scripts/systemd/install.sh @@ -0,0 +1,271 @@ +#!/bin/bash +# RK3588 Media Server Systemd 安装脚本 +# 适用于 Orange Pi 5 Plus (RK3588) + +set -e + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" +echo -e "${BLUE}║ RK3588 Media Server Systemd 安装脚本 ║${NC}" +echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}" +echo "" + +# 检查 root 权限 +if [ "$EUID" -ne 0 ]; then + echo -e "${RED}错误: 请使用 sudo 运行此脚本${NC}" + exit 1 +fi + +# 确定项目目录 +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)" +BUILD_DIR="$PROJECT_DIR/build" +INSTALL_DIR="/opt/rk3588-media-server" +SERVICE_DIR="/etc/systemd/system" + +echo "项目目录: $PROJECT_DIR" +echo "安装目录: $INSTALL_DIR" +echo "" + +# 检查编译产物 +if [ ! -f "$BUILD_DIR/media-server" ]; then + echo -e "${RED}错误: 未找到编译好的 media-server${NC}" + echo "请先编译项目:" + echo " cd $PROJECT_DIR" + echo " cmake -S . -B build -DCMAKE_BUILD_TYPE=Release ..." + echo " cmake --build build -j\$(nproc)" + exit 1 +fi + +# 检查插件 +if [ ! -d "$BUILD_DIR/plugins" ] || [ -z "$(ls -A $BUILD_DIR/plugins/*.so 2>/dev/null)" ]; then + echo -e "${YELLOW}警告: 未找到插件目录或插件为空${NC}" + echo "请确保编译了插件: cmake --build build -j\$(nproc)" + read -p "是否继续? (y/N): " -n 1 -r + echo + [[ ! $REPLY =~ ^[Yy]$ ]] && exit 1 +fi + +echo -e "${GREEN}✓${NC} 编译产物检查通过" +echo "" + +# 选择配置文件 +echo "请选择配置文件:" +echo "" +echo " 1) test_cam1_face_det_rtsp_server.json (推荐 - 简单稳定,无gate问题)" +echo " 2) sample_cam1_native_rtsp_face.json (完整功能 - YOLO+人脸检测+识别)" +echo " 3) test_cam1_face_det_recog_rtsp_server.json (人脸识别)" +echo " 4) sample_cam1.json (完整功能 - 需要手动禁用gate_face_cam1)" +echo "" +read -p "请输入选项 [1-4,默认1]: " choice +choice=${choice:-1} + +case $choice in + 1) + CONFIG_FILE="$PROJECT_DIR/configs/test_cam1_face_det_rtsp_server.json" + CONFIG_DESC="test_cam1_face_det_rtsp_server.json (简单稳定)" + ;; + 2) + CONFIG_FILE="$PROJECT_DIR/configs/sample_cam1_native_rtsp_face.json" + CONFIG_DESC="sample_cam1_native_rtsp_face.json (完整功能)" + ;; + 3) + CONFIG_FILE="$PROJECT_DIR/configs/test_cam1_face_det_recog_rtsp_server.json" + CONFIG_DESC="test_cam1_face_det_recog_rtsp_server.json (人脸识别)" + ;; + 4) + CONFIG_FILE="$PROJECT_DIR/configs/sample_cam1.json" + CONFIG_DESC="sample_cam1.json (完整功能,需手动修复)" + ;; + *) + echo "无效选项,使用默认配置" + CONFIG_FILE="$PROJECT_DIR/configs/test_cam1_face_det_rtsp_server.json" + CONFIG_DESC="test_cam1_face_det_rtsp_server.json (默认)" + ;; +esac + +echo "" +echo -e "选择配置: ${GREEN}$CONFIG_DESC${NC}" +echo "" + +# 开始安装 +echo -e "${YELLOW}[1/6] 创建安装目录...${NC}" +mkdir -p "$INSTALL_DIR"/{bin/plugins,lib,etc,logs,models,web/hls} +echo -e "${GREEN}✓${NC} 目录创建完成" + +echo -e "${YELLOW}[2/6] 复制主程序和插件...${NC}" +cp "$BUILD_DIR/media-server" "$INSTALL_DIR/bin/" +chmod +x "$INSTALL_DIR/bin/media-server" + +# 复制插件 +if [ -d "$BUILD_DIR/plugins" ]; then + cp "$BUILD_DIR"/plugins/*.so "$INSTALL_DIR/bin/plugins/" 2>/dev/null || true + echo -e "${GREEN}✓${NC} 插件复制完成 ($(ls $INSTALL_DIR/bin/plugins/*.so 2>/dev/null | wc -l) 个)" +else + echo -e "${YELLOW}⚠ 未找到插件目录${NC}" +fi + +# 复制依赖库 +if ls "$BUILD_DIR"/*.so 1> /dev/null 2>&1; then + cp "$BUILD_DIR"/*.so "$INSTALL_DIR/lib/" 2>/dev/null || true + echo -e "${GREEN}✓${NC} 依赖库复制完成" +fi + +echo -e "${YELLOW}[3/6] 复制模型文件...${NC}" +# 复制第三方模型 +if [ -d "$PROJECT_DIR/third_party/rknpu2/examples/rknn_yolov5_demo/model/RK3588" ]; then + mkdir -p "$INSTALL_DIR/models" + cp "$PROJECT_DIR/third_party/rknpu2/examples/rknn_yolov5_demo/model/RK3588"/*.rknn "$INSTALL_DIR/models/" 2>/dev/null || true +fi +# 复制项目模型目录 +if [ -d "$PROJECT_DIR/models" ]; then + cp -r "$PROJECT_DIR/models"/* "$INSTALL_DIR/models/" 2>/dev/null || true +fi +echo -e "${GREEN}✓${NC} 模型文件复制完成" + +echo -e "${YELLOW}[4/6] 处理配置文件...${NC}" +# 复制并修复配置 +cp "$CONFIG_FILE" "$INSTALL_DIR/etc/media-server.json" + +# 使用 Python 修复配置文件中的路径 +python3 << EOF +import json +import os + +config_file = "$INSTALL_DIR/etc/media-server.json" +install_dir = "$INSTALL_DIR" +project_dir = "$PROJECT_DIR" + +def fix_path(path): + if not path or not isinstance(path, str): + return path + if path.startswith('./'): + # web/ 路径指向安装目录 + if path.startswith('./web/'): + return os.path.join(install_dir, path[2:]) + # models/ 路径指向安装目录 + elif path.startswith('./models/'): + return os.path.join(install_dir, path[2:]) + # 其他路径,优先相对于项目目录查找,否则安装目录 + else: + abs_path = os.path.join(project_dir, path) + if os.path.exists(abs_path): + return abs_path + return os.path.join(install_dir, path[2:]) + return path + +try: + with open(config_file, 'r') as f: + config = json.load(f) + + # 修复 sample_cam1.json 中的 gate_face_cam1 问题 + for graph in config.get('graphs', []): + nodes = graph.get('nodes', []) + edges = graph.get('edges', []) + + # 找到所有节点ID + node_ids = {node['id'] for node in nodes} + # 找到有输入边的节点 + nodes_with_input = set() + for edge in edges: + if isinstance(edge, list) and len(edge) >= 2: + nodes_with_input.add(edge[1]) + + # 禁用没有输入的 filter/sink 节点 + for node in nodes: + if node.get('role') in ['filter', 'sink'] and node['id'] not in nodes_with_input: + if node.get('enable', True): + print(f"禁用无输入节点: {node['id']} (role={node.get('role')})") + node['enable'] = False + + # 修复所有路径 + for node in nodes: + if 'model_path' in node: + old = node['model_path'] + node['model_path'] = fix_path(old) + if old != node['model_path']: + print(f"修复路径: {old} -> {node['model_path']}") + + if 'gallery' in node and 'path' in node['gallery']: + old = node['gallery']['path'] + node['gallery']['path'] = fix_path(old) + if old != node['gallery']['path']: + print(f"修复路径: {old} -> {node['gallery']['path']}") + + if 'outputs' in node: + for output in node['outputs']: + if 'path' in output: + old = output['path'] + output['path'] = fix_path(old) + if old != output['path']: + print(f"修复路径: {old} -> {output['path']}") + + with open(config_file, 'w') as f: + json.dump(config, f, indent=2) + + print("配置文件处理完成") +except Exception as e: + print(f"处理配置文件时出错: {e}") + # 保留原始文件 +EOF + +echo -e "${GREEN}✓${NC} 配置文件处理完成" +echo " 配置文件: $INSTALL_DIR/etc/media-server.json" +echo "" + +echo -e "${YELLOW}[5/6] 安装 Systemd 服务...${NC}" +cp "$SCRIPT_DIR/media-server.service" "$SERVICE_DIR/" + +# 重新加载 systemd +systemctl daemon-reload +systemctl enable media-server + +echo -e "${GREEN}✓${NC} Systemd 服务安装完成" + +echo -e "${YELLOW}[6/6] 验证安装...${NC}" +echo "" +echo "安装内容:" +echo " 主程序: $(ls -lh $INSTALL_DIR/bin/media-server | awk '{print $5, $9}')" +echo " 插件数: $(ls $INSTALL_DIR/bin/plugins/*.so 2>/dev/null | wc -l) 个" +echo " 模型数: $(ls $INSTALL_DIR/models/*.rknn 2>/dev/null | wc -l) 个" +echo " 配置: $INSTALL_DIR/etc/media-server.json" +echo "" + +echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}║ 安装完成! ║${NC}" +echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}" +echo "" +echo "管理命令:" +echo " 启动: sudo systemctl start media-server" +echo " 停止: sudo systemctl stop media-server" +echo " 状态: sudo systemctl status media-server" +echo " 日志: sudo journalctl -u media-server -f" +echo "" +echo "重要提示:" +echo " 1. 编辑配置修改RTSP源地址:" +echo " sudo nano $INSTALL_DIR/etc/media-server.json" +echo "" +echo " 2. 确保模型文件存在:" +echo " ls $INSTALL_DIR/models/" +echo "" +echo " 3. 首次启动前检查RTSP源是否可访问" +echo "" + +read -p "是否立即启动服务? (y/N): " -n 1 -r +echo +if [[ $REPLY =~ ^[Yy]$ ]]; then + systemctl start media-server + sleep 2 + if systemctl is-active --quiet media-server; then + echo -e "${GREEN}✓${NC} 服务启动成功!" + systemctl status media-server --no-pager + else + echo -e "${RED}✗${NC} 服务启动失败,查看日志:" + echo " sudo journalctl -u media-server -n 20" + fi +fi diff --git a/scripts/systemd/media-server.service b/scripts/systemd/media-server.service index a88eb5f..37027c8 100644 --- a/scripts/systemd/media-server.service +++ b/scripts/systemd/media-server.service @@ -9,6 +9,8 @@ Type=simple User=root Group=root WorkingDirectory=/opt/rk3588-media-server +Environment="LD_LIBRARY_PATH=/opt/rk3588-media-server/lib:/opt/rk3588-media-server/bin/plugins:%LD_LIBRARY_PATH" +Environment="RKNN_LOG_LEVEL=2" ExecStart=/opt/rk3588-media-server/bin/media-server --config /opt/rk3588-media-server/etc/media-server.json ExecReload=/bin/kill -HUP $MAINPID KillMode=mixed @@ -23,18 +25,10 @@ StartLimitBurst=3 LimitNOFILE=65535 LimitNPROC=4096 -# 环境变量 -Environment="LD_LIBRARY_PATH=/opt/rk3588-media-server/lib:$LD_LIBRARY_PATH" - # 日志输出 StandardOutput=journal StandardError=journal SyslogIdentifier=media-server -# 安全设置(根据实际需求调整) -# NoNewPrivileges=false -# ProtectSystem=false -# ProtectHome=false - [Install] WantedBy=multi-user.target diff --git a/scripts/systemd/quick-setup.sh b/scripts/systemd/quick-setup.sh deleted file mode 100644 index 473af6e..0000000 --- a/scripts/systemd/quick-setup.sh +++ /dev/null @@ -1,102 +0,0 @@ -#!/bin/bash -# RK3588 Media Server 快速设置脚本 -# 适用于开发板直接编译部署 - -set -e - -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' - -echo -e "${YELLOW}========== RK3588 Media Server 快速设置 ==========${NC}" -echo "" - -# 检测是否在 Orange Pi 上 -if [[ "$(uname -m)" != "aarch64" ]]; then - echo "警告: 当前不是 ARM64 架构,此脚本适用于 RK3588 开发板" - read -p "是否继续? (y/N): " -n 1 -r - echo - [[ ! $REPLY =~ ^[Yy]$ ]] && exit 1 -fi - -# 检查 sudo -if [ "$EUID" -ne 0 ]; then - echo "请使用 sudo 运行" - exit 1 -fi - -PROJECT_DIR="$(cd "$(dirname "$0")/../.." && pwd)" -BUILD_DIR="$PROJECT_DIR/build" - -echo "项目目录: $PROJECT_DIR" -echo "" - -# 步骤1: 检查编译 -echo "[1/4] 检查编译状态..." -if [ ! -f "$BUILD_DIR/media-server" ]; then - echo "未找到编译好的 media-server,开始编译..." - echo "" - echo "CMake 配置:" - cmake -S "$PROJECT_DIR" -B "$BUILD_DIR" \ - -DCMAKE_BUILD_TYPE=Release \ - -DBUILD_TESTS=OFF \ - -DBUILD_SAMPLES=ON \ - -DRK3588_ENABLE_FFMPEG=ON \ - -DRK3588_ENABLE_MPP=ON \ - -DRK3588_ENABLE_RGA=ON \ - -DRK3588_ENABLE_ZLMEDIAKIT=ON \ - -DRK3588_ENABLE_RKNN=ON \ - -DRK_ZLMK_API_LIB_PATH="$PROJECT_DIR/third_party/rknpu2/examples/3rdparty/zlmediakit/aarch64/libmk_api.so" \ - -DRK_ZLMEDIAKIT_INCLUDE_DIR="$PROJECT_DIR/third_party/rknpu2/examples/3rdparty/zlmediakit/include" - - echo "" - echo "开始编译(使用 $(nproc) 线程)..." - cmake --build "$BUILD_DIR" -j$(nproc) -else - echo -e "${GREEN}✓${NC} 已编译" -fi -echo "" - -# 步骤2: 安装 systemd 服务 -echo "[2/4] 安装 Systemd 服务..." -"$(dirname "$0")/install-systemd.sh" \ - --media-bin "$BUILD_DIR/media-server" \ - --media-config "$PROJECT_DIR/configs/sample_cam1.json" \ - --agent-bin "$PROJECT_DIR/agent/rk3588-agent_linux_arm64" \ - --agent-config "$PROJECT_DIR/agent/agent_cam1.config.json" - -echo "" - -# 步骤3: 检查端口 -echo "[3/4] 检查端口..." -for port in 9000 8554 8555 9100; do - if ss -tln | grep -q ":$port "; then - echo -e " ${GREEN}✓${NC} 端口 $port 监听正常" - else - echo " 端口 $port 未监听" - fi -done -echo "" - -# 步骤4: 测试 -echo "[4/4] 快速测试..." -sleep 2 -if systemctl is-active --quiet media-server; then - echo -e "${GREEN}Media Server 运行正常${NC}" - echo "" - echo "测试地址:" - IP=$(hostname -I | awk '{print $1}') - echo " HLS: http://$IP:9000/hls/cam1/index.m3u8" - echo " RTSP: rtsp://$IP:8555/live/cam1" -else - echo "Media Server 可能未正常启动,请检查日志:" - echo " journalctl -u media-server -n 20" -fi -echo "" - -echo -e "${GREEN}设置完成!${NC}" -echo "" -echo "常用命令:" -echo " 查看状态: $(dirname "$0")/status.sh" -echo " 查看日志: journalctl -u media-server -f" -echo " 重启服务: systemctl restart media-server" diff --git a/scripts/systemd/status.sh b/scripts/systemd/status.sh index 4dc9652..41d1874 100644 --- a/scripts/systemd/status.sh +++ b/scripts/systemd/status.sh @@ -7,13 +7,13 @@ YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' -echo -e "${BLUE}========== RK3588 Media Server & Agent 状态 ==========${NC}" +echo -e "${BLUE}========== RK3588 Media Server 状态 ==========${NC}" echo "" # 显示系统信息 echo -e "${YELLOW}[系统信息]${NC}" echo " 时间: $(date '+%Y-%m-%d %H:%M:%S')" -echo " 运行时间: $(uptime -p 2>/dev/null || uptime)" +echo " 运行时间: $(uptime -p 2>/dev/null || uptime | awk -F',' '{print $1}')" echo "" # NPU 负载 @@ -31,7 +31,7 @@ echo "" echo -e "${YELLOW}[Media Server]${NC}" if systemctl is-active --quiet media-server 2>/dev/null; then echo -e " 状态: ${GREEN}● 运行中${NC}" - PID=$(systemctl show --property=MainPID --value media-server) + PID=$(systemctl show --property=MainPID --value media-server 2>/dev/null) echo " PID: $PID" # 资源使用 @@ -47,32 +47,30 @@ if systemctl is-active --quiet media-server 2>/dev/null; then done else echo -e " 状态: ${RED}○ 停止${NC}" + echo " 最后错误:" + journalctl -u media-server --no-pager -n 3 2>/dev/null | tail -3 | sed 's/^/ /' fi echo "" -# Agent 状态 -echo -e "${YELLOW}[RK3588 Agent]${NC}" -if systemctl is-active --quiet rk3588-agent 2>/dev/null; then - echo -e " 状态: ${GREEN}● 运行中${NC}" - PID=$(systemctl show --property=MainPID --value rk3588-agent) - echo " PID: $PID" - - if [ -n "$PID" ] && [ "$PID" != "0" ]; then - CPU_MEM=$(ps -p $PID -o %cpu,%mem --no-headers 2>/dev/null || echo "N/A") - echo " CPU/MEM: $CPU_MEM" +# Agent 状态(如果安装了) +if systemctl list-unit-files | grep -q rk3588-agent; then + echo -e "${YELLOW}[RK3588 Agent]${NC}" + if systemctl is-active --quiet rk3588-agent 2>/dev/null; then + echo -e " 状态: ${GREEN}● 运行中${NC}" + PID=$(systemctl show --property=MainPID --value rk3588-agent 2>/dev/null) + if [ -n "$PID" ] && [ "$PID" != "0" ]; then + CPU_MEM=$(ps -p $PID -o %cpu,%mem --no-headers 2>/dev/null || echo "N/A") + echo " CPU/MEM: $CPU_MEM" + fi + else + echo -e " 状态: ${RED}○ 停止${NC}" fi -else - echo -e " 状态: ${RED}○ 停止${NC}" + echo "" fi -echo "" # 日志摘要 -echo -e "${YELLOW}[最近日志]${NC}" -echo "Media Server (最后3行):" -journalctl -u media-server --no-pager -n 3 2>/dev/null | tail -3 || echo " 无日志" -echo "" -echo "Agent (最后3行):" -journalctl -u rk3588-agent --no-pager -n 3 2>/dev/null | tail -3 || echo " 无日志" +echo -e "${YELLOW}[最近日志 - Media Server]${NC}" +journalctl -u media-server --no-pager -n 5 2>/dev/null | tail -5 || echo " 无日志" echo "" # 操作提示 @@ -80,3 +78,4 @@ echo -e "${YELLOW}[管理命令]${NC}" echo " 重启服务: sudo systemctl restart media-server" echo " 查看日志: sudo journalctl -u media-server -f" echo " 查看NPU: sudo watch -n 1 cat /sys/kernel/debug/rknpu/load" +echo " 编辑配置: sudo nano /opt/rk3588-media-server/etc/media-server.json" diff --git a/scripts/systemd/uninstall-systemd.sh b/scripts/systemd/uninstall.sh similarity index 61% rename from scripts/systemd/uninstall-systemd.sh rename to scripts/systemd/uninstall.sh index 02ef018..ac959bb 100644 --- a/scripts/systemd/uninstall-systemd.sh +++ b/scripts/systemd/uninstall.sh @@ -1,5 +1,5 @@ #!/bin/bash -# RK3588 Media Server & Agent Systemd 服务卸载脚本 +# RK3588 Media Server 卸载脚本 set -e @@ -8,7 +8,10 @@ GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' -echo -e "${YELLOW}========== RK3588 Media Server & Agent 卸载 ==========${NC}" +INSTALL_DIR="${1:-/opt/rk3588-media-server}" + +echo -e "${YELLOW}========== RK3588 Media Server 卸载 ==========${NC}" +echo "安装目录: $INSTALL_DIR" echo "" if [ "$EUID" -ne 0 ]; then @@ -27,15 +30,12 @@ fi # 停止服务 echo "[1/4] 停止服务..." systemctl stop media-server 2>/dev/null || true -systemctl stop rk3588-agent 2>/dev/null || true systemctl disable media-server 2>/dev/null || true -systemctl disable rk3588-agent 2>/dev/null || true echo -e "${GREEN}✓${NC} 服务已停止并禁用" # 删除服务文件 echo "[2/4] 删除服务文件..." rm -f /etc/systemd/system/media-server.service -rm -f /etc/systemd/system/rk3588-agent.service systemctl daemon-reload echo -e "${GREEN}✓${NC} 服务文件已删除" @@ -44,14 +44,14 @@ echo "[3/4] 备份配置..." BACKUP_DIR="/root/rk3588-backup-$(date +%Y%m%d%H%M%S)" mkdir -p "$BACKUP_DIR" -if [ -f "/opt/rk3588-media-server/etc/media-server.json" ]; then - cp "/opt/rk3588-media-server/etc/media-server.json" "$BACKUP_DIR/" - echo " 已备份 media-server 配置" +if [ -f "$INSTALL_DIR/etc/media-server.json" ]; then + cp "$INSTALL_DIR/etc/media-server.json" "$BACKUP_DIR/" + echo " 已备份配置文件" fi -if [ -f "/opt/rk3588-agent/agent.config.json" ]; then - cp "/opt/rk3588-agent/agent.config.json" "$BACKUP_DIR/" - echo " 已备份 agent 配置" +if [ -d "$INSTALL_DIR/models" ]; then + cp -r "$INSTALL_DIR/models" "$BACKUP_DIR/" 2>/dev/null || true + echo " 已备份模型文件" fi echo -e "${GREEN}✓${NC} 配置已备份到: $BACKUP_DIR" @@ -60,20 +60,17 @@ echo -e "${GREEN}✓${NC} 配置已备份到: $BACKUP_DIR" echo "[4/4] 清理文件..." echo "" echo "以下目录需要手动删除(如需完全清理):" -echo " /opt/rk3588-media-server/" -echo " /opt/rk3588-agent/" +echo " $INSTALL_DIR/" echo "" read -p "是否删除这些目录? (y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then - rm -rf /opt/rk3588-media-server/ - rm -rf /opt/rk3588-agent/ + rm -rf "$INSTALL_DIR" echo -e "${GREEN}✓${NC} 目录已删除" else echo "保留目录,如需删除请手动执行:" - echo " sudo rm -rf /opt/rk3588-media-server/" - echo " sudo rm -rf /opt/rk3588-agent/" + echo " sudo rm -rf $INSTALL_DIR" fi echo ""