当我们需要在嵌入式设备上实现实时视频分析时,硬件解码与AI推理的高效结合成为关键。RK3588作为一款高性能嵌入式处理器,其内置的rkmpp硬件解码模块能够显著提升视频流处理效率。本文将手把手带你完成从环境搭建到最终部署的全过程。
在开始之前,确保你的RK3588开发板已安装Ubuntu或Debian系统。我们首先需要配置编译环境并获取rkmpp源代码。
基础依赖安装:
bash复制sudo apt update
sudo apt install -y git cmake make gcc g++ pkg-config libdrm-dev libx11-dev
获取rkmpp源代码并编译:
bash复制git clone --depth 1 https://github.com/rockchip-linux/mpp.git
cd mpp/build/linux/aarch64/
./make-Makefiles.bash
make -j$(nproc)
sudo make install
注意:编译过程中可能会遇到依赖缺失问题,根据提示安装相应包即可。建议使用
-j$(nproc)参数充分利用多核性能加速编译。
验证安装是否成功:
bash复制cd /usr/local/bin
sudo ./mpp_info_test
sudo tail -n 20 /var/log/syslog
如果看到类似"mpp version: 1.4.0"的输出,说明安装成功。
海康威视摄像头通常支持RTSP协议进行视频流传输。首先需要确认摄像头的网络连接和RTSP地址格式。
典型的RTSP地址格式为:
code复制rtsp://[用户名]:[密码]@[IP地址]:[端口]/[编码格式]/[通道]/[码流类型]/av_stream
例如:
code复制rtsp://admin:123456@192.168.1.64:554/h264/ch1/main/av_stream
测试连接可用性:
bash复制sudo apt install -y ffmpeg
ffmpeg -i "rtsp://admin:123456@192.168.1.64:554/h264/ch1/main/av_stream" -f null -
如果没有报错且能看到帧率信息,说明连接正常。
rkmpp提供了多种测试工具,我们可以先用本地文件测试解码功能:
bash复制cd /usr/local/bin
wget http://example.com/test.h264 -O test.h264
sudo ./mpi_dec_test -t 7 -i test.h264 -o output.yuv
参数说明:
-t 7:指定H.264解码-i:输入文件-o:输出文件(可选)对于RTSP流,我们需要编写一个小程序来桥接网络流和解码器。以下是关键代码片段:
c复制// 初始化MPP解码器
MppCtx ctx;
MppApi *mpi;
mpp_create(&ctx, &mpi);
mpp_init(ctx, MPP_CTX_DEC, MPP_VIDEO_CodingAVC);
// 配置解码参数
MppDecCfg cfg;
mpp_dec_cfg_init(&cfg);
mpp_dec_cfg_set_u32(cfg, "base:out_mode", MPP_DEC_OUT_MODE_AFBC);
// 循环处理帧数据
while (running) {
MppPacket packet;
MppFrame frame;
// 从RTSP获取数据包
get_rtsp_packet(&packet);
// 解码
mpi->decode_put_packet(ctx, packet);
mpi->decode_get_frame(ctx, &frame);
if (frame) {
// 处理解码后的帧
process_frame(frame);
mpp_frame_deinit(&frame);
}
mpp_packet_deinit(&packet);
}
在RK3588上运行YOLOv5需要先将PyTorch模型转换为RKNN格式。以下是转换步骤:
1. 安装RKNN-Toolkit2:
bash复制pip install rknn-toolkit2
2. 模型转换脚本:
python复制from rknn.api import RKNN
rknn = RKNN()
rknn.config(target_platform='rk3588')
rknn.load_pytorch(model='yolov5s.pt', input_size_list=[[3, 640, 640]])
rknn.build(do_quantization=True, dataset='./dataset.txt')
rknn.export_rknn('./yolov5s.rknn')
3. 部署到开发板:
bash复制git clone https://github.com/rockchip-linux/rknpu2
cd rknpu2/examples/rknn_yolov5_demo
./build-linux_RK3588.sh
cd install/rknn_yolov5_demo_Linux/
运行推理程序:
bash复制./rknn_yolov5_video_demo yolov5s.rknn rtsp://admin:123456@192.168.1.64:554/h264/ch1/main/av_stream 264
性能对比数据:
| 解码方式 | CPU占用率 | 解码延迟 | 功耗 |
|---|---|---|---|
| 软解 | 80-90% | 50-80ms | 3.2W |
| rkmpp硬解 | 10-15% | 5-15ms | 2.1W |
常见问题解决方案:
解码失败:
-fps 30参数限制帧率RKNN模型推理速度慢:
rknn.config(target_platform='rk3588', npu_precision='uint8')RTSP连接不稳定:
ffmpeg -rtsp_transport tcp -bufsize 1024k -i rtsp://...内存优化技巧:
c复制// 使用DRM缓冲区共享减少内存拷贝
MppBufferGroup buf_grp;
mpp_buffer_group_get_internal(&buf_grp, MPP_BUFFER_TYPE_DRM);
mpp_dec_cfg_set_u32(cfg, "base:mem_type", MPP_BUFFER_TYPE_DRM);
将各个模块整合为一个完整的视频分析系统需要考虑以下几个关键点:
多线程架构设计:
python复制import threading
class VideoPipeline:
def __init__(self):
self.frame_queue = Queue(maxsize=10)
self.stop_event = threading.Event()
def capture_thread(self):
while not self.stop_event.is_set():
frame = capture_rtsp_frame()
self.frame_queue.put(frame)
def process_thread(self):
while not self.stop_event.is_set():
frame = self.frame_queue.get()
results = run_inference(frame)
visualize_results(frame, results)
def start(self):
threading.Thread(target=self.capture_thread).start()
threading.Thread(target=self.process_thread).start()
性能监控脚本:
bash复制#!/bin/bash
while true; do
cpu_usage=$(top -bn1 | grep "rknn" | awk '{print $9}')
mem_usage=$(free -m | grep Mem | awk '{print $3}')
echo "$(date '+%H:%M:%S') CPU: ${cpu_usage}% MEM: ${mem_usage}MB"
sleep 1
done
自动化启动配置:
创建systemd服务文件/etc/systemd/system/ai_camera.service:
code复制[Unit]
Description=AI Camera Service
After=network.target
[Service]
ExecStart=/usr/local/bin/ai_camera_start.sh
Restart=always
User=root
[Install]
WantedBy=multi-user.target
启动服务:
bash复制sudo systemctl enable ai_camera
sudo systemctl start ai_camera
在实际项目中,我们发现使用RGA(Raster Graphic Acceleration)进行图像预处理可以进一步提升性能。以下是一个典型的处理流程:
这个流程完全可以在硬件层面完成,几乎不占用CPU资源。