修改部署脚本

This commit is contained in:
tian 2026-02-25 12:37:08 +08:00
parent 02c5dd2f6d
commit ad0f7ccfa3
9 changed files with 470 additions and 704 deletions

View File

@ -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

View File

@ -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 文档

150
scripts/systemd/README.md Normal file
View File

@ -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文档

View File

@ -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 "$@"

271
scripts/systemd/install.sh Normal file
View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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"

View File

@ -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 ""