OrangePi3588Media/docs/deployment.md

521 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# RK3588 Media Server 部署指南
## 架构说明
```
┌─────────────────────────────────────────────────────────────┐
│ RK3588 Device │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Media Server │ │ RK3588 Agent │ │
│ │ (systemd) │◄────│ (systemd) │ │
│ │ │ │ │ │
│ │ - RTSP输出 │ │ - Web管理界面 │ │
│ │ - HLS输出 │ │ - 服务监控 │ │
│ │ - NPU推理 │ │ - 远程配置 │ │
│ └─────────┬───────────┘ └─────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────┐ │
│ │ 运行时数据目录 │ │
│ │ /var/lib/rk3588-media-server/ │ │
│ │ ├── hls/ - HLS分片输出 (root) │ │
│ │ ├── logs/ - 应用日志 (orangepi) │ │
│ │ ├── alarms/ - 告警截图 (orangepi) │ │
│ │ └── clips/ - 告警视频片段 (orangepi) │ │
│ └───────────────────────────────────────────────────┘ │
│ │
│ /opt/rk3588-media-server/ # 程序文件 │
│ /opt/rk3588-agent/ # Agent程序 │
└─────────────────────────────────────────────────────────────┘
```
### 设计特点
- **Media Server**: 独立的 systemd 服务,高可用(崩溃自动重启)
- **Agent**: 独立的 systemd 服务,通过 `systemctl` 监控和控制 Media Server
- **两者可独立重启**: 重启 Agent 不会影响 Media Server
- **运行时数据分离**: 程序文件在 `/opt/`,数据在 `/var/lib/`
- **自动清理**: HLS 分片、日志、告警数据自动轮转清理
---
## 快速开始
### 1. 编译
在 RK3588 设备上编译:
```bash
cd ~/apps/OrangePi3588Media
# 一键编译(推荐)
./scripts/build.sh
# 或使用完整 cmake 命令
cmake -S . -B build \
-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=$PWD/third_party/rknpu2/examples/3rdparty/zlmediakit/aarch64/libmk_api.so \
-DRK_ZLMEDIAKIT_INCLUDE_DIR=$PWD/third_party/rknpu2/examples/3rdparty/zlmediakit/include
cmake --build build -j$(nproc)
# 仅编译 Media Server
./scripts/build.sh -m
# 仅编译 Agent
./scripts/build.sh -a
# Debug 模式编译
./scripts/build.sh -d
# 清理后重新编译
./scripts/build.sh -c
```
**编译脚本选项:**
| 选项 | 说明 |
|------|------|
| `-h, --help` | 显示帮助 |
| `-c, --clean` | 清理构建目录后编译 |
| `-j N` | 指定并行编译线程数 |
| `-m, --media-only` | 仅编译 Media Server |
| `-a, --agent-only` | 仅编译 Agent |
| `-d, --debug` | Debug 模式编译 |
**环境变量:**
| 变量 | 默认值 | 说明 |
|------|--------|------|
| `BUILD_TYPE` | Release | 编译类型 |
| `BUILD_TESTS` | OFF | 是否编译测试 |
| `BUILD_SAMPLES` | ON | 是否编译示例 |
| `ENABLE_FFMPEG` | ON | 启用 FFmpeg |
| `ENABLE_MPP` | ON | 启用 MPP |
| `ENABLE_RGA` | ON | 启用 RGA |
| `ENABLE_ZLMEDIAKIT` | ON | 启用 ZLMediaKit |
| `ENABLE_RKNN` | ON | 启用 RKNN |
### 2. 部署
```bash
cd ~/apps/OrangePi3588Media
sudo ./scripts/deploy.sh install
```
部署过程会:
1. 安装 Media Server 和 Agent 到 `/opt/`
2. 创建运行时数据目录 `/var/lib/rk3588-media-server/`
3. 配置日志轮转和自动清理
4. 启动 systemd 服务
### 3. 查看状态
```bash
sudo ./scripts/deploy.sh status
```
### 3.1 DDR 固频排障
当出现 `CPU/NPU` 利用率不高,但 RTSP 输出帧率周期性跌落时,优先检查 DDR devfreq 是否在频繁降频。
项目内置了 DDR 模式切换脚本:
```bash
sudo bash ./scripts/ddr_mode.sh status
sudo bash ./scripts/ddr_mode.sh performance
sudo bash ./scripts/ddr_mode.sh restore
```
也可以从运维入口调用:
```bash
sudo ./scripts/ops.sh ddr-status
sudo ./scripts/ops.sh ddr-performance
sudo ./scripts/ops.sh ddr-restore
```
说明:
- `performance`:保存当前 governor/min/max 后,将 DDR 切到高性能模式
- `restore`:恢复到切换前保存的 governor/min/max
- 默认节点为 `/sys/class/devfreq/dmc`
### 3.2 RTSP 解码推荐
对高位监控、烟雾多、偶发 H.264 参考帧异常的 RTSP 源,优先使用 `FFmpeg CPU decode + MPP encode` 组合。
推荐配置:
```bash
./build/media-server -c configs/person_shoe_two_stage_recommended.json
```
如需直接启用“缺鞋”判定和按人冷却告警,可使用:
```bash
./build/media-server -c configs/person_shoe_two_stage_recommended_alarm.json
```
如果业务目标是“只关心已检测到的鞋是否为黑色劳保鞋”,可使用:
```bash
./build/media-server -c configs/person_shoe_two_stage_workshoe_alarm.json
```
说明:
- 输入端:`use_ffmpeg: true`、`use_mpp: false`
- 输出端:仍然使用 `MPP` 编码
- 适用场景:源流在 VLC 中播放正常,但项目内 `ffmpeg demux + mpp decode` 会出现固定画面卡顿
排障建议:
-`configs/sample_rtsp_publish_only.json` 会卡,但 VLC 直接拉原始 RTSP 源不卡,优先切到 FFmpeg 解码版验证
- 若 FFmpeg 解码版不卡,则说明问题主要在 MPP 解码兼容性,而不是 AI 链路或发布链路
### 4. 卸载
```bash
sudo ./scripts/deploy.sh uninstall
```
---
## 完整命令参考
### 部署脚本命令
| 命令 | 说明 |
|------|------|
| `sudo ./deploy.sh install` | 安装/部署服务 |
| `sudo ./deploy.sh upgrade` | 升级服务(保留配置和数据)|
| `sudo ./deploy.sh status` | 查看详细运行状态 |
| `sudo ./deploy.sh logs` | 查看实时日志 |
| `sudo ./deploy.sh clean-hls [天数]` | 清理 HLS 旧分片 |
| `sudo ./deploy.sh uninstall` | 卸载服务 |
### Media Server 服务管理
```bash
# 启动/停止/重启
sudo systemctl start media-server
sudo systemctl stop media-server
sudo systemctl restart media-server
# 查看状态
sudo systemctl status media-server
# 查看日志 (systemd)
sudo journalctl -u media-server -f
sudo journalctl -u media-server --since "1 hour ago"
# 直接查看日志文件 (无需 sudo)
ls -la /var/lib/rk3588-media-server/logs/
cat /var/lib/rk3588-media-server/logs/media-server.log
```
### Agent 服务管理
```bash
# 启动/停止/重启(不影响 Media Server
sudo systemctl start rk3588-agent
sudo systemctl stop rk3588-agent
sudo systemctl restart rk3588-agent
# 查看状态
sudo systemctl status rk3588-agent
# 查看日志 (systemd)
sudo journalctl -u rk3588-agent -f
# Agent 日志文件位置
cat /var/lib/rk3588-agent/agent.log
```
---
## 目录结构
### 程序目录 (/opt/)
```
/opt/rk3588-media-server/
├── bin/
│ ├── media-server # 主程序
│ ├── cleanup-hls.sh # HLS清理脚本
│ └── plugins/ # 插件目录
│ ├── libinput_rtsp.so
│ ├── libai_yolo.so
│ ├── libosd.so
│ ├── libtracker.so
│ └── ...
├── lib/ # 依赖库
├── etc/
│ └── media-server.json # 配置文件
├── models/ # AI模型文件
│ ├── best-640.rknn
│ ├── yolov5s-640-640.rknn
│ └── ...
└── web/ # Web静态文件
├── index.html
├── graph.html
├── hls_player.html # HLS播放器
└── hls/ # HLS输出(符号链接)
/opt/rk3588-agent/
├── rk3588-agent # Agent程序
└── agent.config.json # Agent配置
```
### 运行时数据目录 (/var/lib/)
```
/var/lib/rk3588-media-server/
├── hls/ # HLS直播分片 (root:root, 755)
│ ├── cam1/
│ │ ├── index.m3u8
│ │ ├── index0.ts
│ │ └── ...
│ ├── cam2/
│ └── ...
├── logs/ # 应用日志 (orangepi:orangepi, 755)
├── alarms/ # 告警截图 (orangepi:orangepi, 755)
└── clips/ # 告警视频片段 (orangepi:orangepi, 755)
/var/lib/rk3588-agent/
└── device_id # 设备唯一标识 (orangepi:orangepi)
```
**权限说明:**
- `logs/`, `alarms/`, `clips/` 目录归属于 `orangepi:orangepi`,方便默认用户查看和管理
- `hls/` 目录归属于 `root:root`,但权限 755 允许 orangepi 组读取
- Agent 相关目录归属于 `orangepi:orangepi`
---
## 配置修改
编辑配置文件:
```bash
sudo nano /opt/rk3588-media-server/etc/media-server.json
```
修改后重启服务:
```bash
sudo systemctl restart media-server
```
---
## 数据管理
### HLS 分片清理
HLS 分片自动清理策略:
- **默认保留**: 3天
- **自动执行**: 每天凌晨3点
- **手动执行**: `sudo /opt/rk3588-media-server/bin/cleanup-hls.sh [天数]`
### 日志轮转
日志自动轮转策略:
- **保留周期**: 7天
- **压缩**: 启用
- **位置**: `/var/lib/rk3588-media-server/logs/`
- **文件归属**: `orangepi:orangepi`(方便默认用户查看)
### 告警数据清理
自动清理策略(通过 cron
- **告警视频** (clips): 保留30天
- **告警图片** (alarms): 保留90天
查看当前存储使用:
```bash
# 使用部署脚本查看(推荐)
sudo ./scripts/deploy.sh status
# 或直接查看目录大小
du -sh /var/lib/rk3588-media-server/*/
```
---
## 升级
升级步骤(保留配置和数据):
```bash
cd ~/apps/OrangePi3588Media
# 1. 拉取最新代码
git pull
# 2. 重新编译(清理后编译确保干净)
./scripts/build.sh -c
# 3. 执行升级
sudo ./scripts/deploy.sh upgrade
```
---
## Web 管理界面
### Agent 管理界面
```
http://<设备IP>:9100
```
功能:
- 查看 Media Server 运行状态
- 启动/停止/重启 Media Server
- 查看配置信息
### HLS 播放器
```
http://<设备IP>:9000/hls_player.html
```
功能:
- 5 路视频同时播放
- 自适应布局
- 实时状态显示
---
## 故障排查
### 服务无法启动
```bash
# 查看详细错误
sudo journalctl -u media-server -n 50
# 检查配置文件语法
sudo cat /opt/rk3588-media-server/etc/media-server.json | python3 -m json.tool
# 检查目录权限
ls -la /var/lib/rk3588-media-server/
ls -la /opt/rk3588-media-server/
# 修复日志目录权限(如需要)
sudo chown orangepi:orangepi /var/lib/rk3588-media-server/logs
sudo chown orangepi:orangepi /var/lib/rk3588-media-server/alarms
sudo chown orangepi:orangepi /var/lib/rk3588-media-server/clips
```
### NPU 问题
```bash
# 查看 NPU 状态
cat /proc/rknpu/load
cat /proc/rknpu/version
# 查看设备节点
ls -la /dev/rknpu*
# 查看温度
cat /sys/class/thermal/thermal_zone6/temp
```
### HLS 无法播放
```bash
# 检查 HLS 输出目录
ls -la /var/lib/rk3588-media-server/hls/
# 检查分片生成
ls -la /var/lib/rk3588-media-server/hls/cam1/
# 检查服务端口
ss -tlnp | grep 9000
```
### RTSP 无法连接
```bash
# 本地测试
ffplay rtsp://localhost:8555/live/cam1
# 检查端口
ss -tlnp | grep 8555
# 查看编码器状态
grep "RKVENC" /proc/mpp_service/sessions-summary
```
---
## 系统要求
- **硬件**: Orange Pi 5 Plus (RK3588) 或其他 RK3588 设备
- **系统**: Ubuntu 22.04 LTS (ARM64) 或 Debian 11
- **内存**: 建议 4GB 以上
- **存储**: 建议 32GB 以上HLS 分片占用空间)
- **依赖**: RKNN Runtime, MPP, FFmpeg
---
## 性能参考
5 路 720p@30fps 并发处理:
| 资源 | 使用率 | 备注 |
|------|--------|------|
| NPU Core0 | 70-80% | YOLO 推理 |
| CPU | 20-30% | 预处理、编码 |
| 编码器 | 5 路 720p | H264 CBR 2Mbps |
| 温度 | 50-60°C | 正常范围 |
| 内存 | 3-4GB | 包含系统 |
---
## 备份与恢复
### 备份配置和数据
```bash
# 创建备份
BACKUP_DIR="/root/rk3588-backup-$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"
# 备份配置
cp /opt/rk3588-media-server/etc/media-server.json "$BACKUP_DIR/"
# 备份模型
cp -r /opt/rk3588-media-server/models "$BACKUP_DIR/"
# 备份 HLS可选占用空间大
cp -r /var/lib/rk3588-media-server/hls "$BACKUP_DIR/"
echo "备份完成: $BACKUP_DIR"
```
### 恢复
```bash
# 恢复配置
cp "$BACKUP_DIR/media-server.json" /opt/rk3588-media-server/etc/
# 恢复模型
cp -r "$BACKUP_DIR/models"/* /opt/rk3588-media-server/models/
# 重启服务
sudo systemctl restart media-server
```