核心价值
把视频编码交给 RK3576 的 VPU 硬件,CPU 腾出来跑算法——人脸检测、边缘检测、目标追踪等实时处理才不会卡。
为什么需要硬件加速
OpenCV 默认用 CPU 做所有事情:解码、处理、编码、渲染。当你想同时做多件事(比如边跑人脸检测边录制视频),CPU 就忙不过来了。
硬件加速的本质:让专用硬件分担工作,CPU 专注于实时算法处理。
| 场景 | 不用硬件加速 | 用硬件加速 |
|---|---|---|
| 人脸检测 + 录制 | CPU 又要检测又要编码,帧率暴跌 | VPU 编码,CPU 专心检测 |
| 边看边录 | 14.3fps,明显卡顿 | 25fps,满帧流畅 |
| 多路视频处理 | CPU 过载,丢帧严重 | 硬件分担,多路并行 |
实测数据
| 指标 | CPU 全干(OpenCV) | 硬件分担(MPP) | 提升 |
|---|---|---|---|
| 边录边显示帧率 | 14.3fps | 25.0fps | +75% |
| 录制文件大小/10s | 12.8MB | 3.5MB | 缩小70% |
| CPU 余量(可跑算法) | 几乎没有 | 充足 | — |
一句话总结
硬件加速 = CPU 不用管编码了 → 实时处理不掉帧 + 顺带文件还更小。
前置检查
确保 MPP 插件可用(泰山派出厂系统已预装):
gst-inspect-1.0 mpph264enc 2>&1 | head -1看到 Factory Details: 就说明可用。如果报错 No such element:
sudo apt install -y gstreamer1.0-rockchip快速上手:三个场景
设备号替换
以下命令中 /dev/video73 需要替换为你的实际设备号:
v4l2-ctl --list-devices | grep -A1 usb | grep /dev/video | head -1场景1:只录制,不显示
后台录制一段高效压缩的视频(CPU 空出来干别的):
gst-launch-1.0 -q \
v4l2src device=/dev/video73 num-buffers=250 \
! image/jpeg,width=1280,height=720,framerate=25/1 \
! jpegdec ! videoconvert \
! videorate ! video/x-raw,framerate=25/1 \
! mpph264enc ! h264parse ! mp4mux \
! filesink location=record.mp42
3
4
5
6
7
| 参数 | 说明 |
|---|---|
num-buffers=250 | 录制 10 秒(25fps × 10s) |
| 改成 750 | 录制 30 秒 |
| 删掉此参数 | 持续录制,Ctrl+C 停止 |
场景2:边看边录(推荐)
屏幕实时显示画面,同时录制 H.264 文件——不掉帧:
DISPLAY=:0 gst-launch-1.0 \
v4l2src device=/dev/video73 num-buffers=250 \
! image/jpeg,width=1280,height=720,framerate=25/1 \
! jpegdec ! videoconvert \
! tee name=t \
t. ! queue ! videorate ! video/x-raw,framerate=25/1 \
! mpph264enc ! h264parse ! mp4mux \
! filesink location=record.mp4 \
t. ! queue ! autovideosink sync=false2
3
4
5
6
7
8
9
效果:25fps 流畅显示 + 3.5MB/10s 高效录制,两不误。
WARNING
通过 ADB/SSH 运行时必须加 DISPLAY=:0,否则无法显示画面。
场景3:持续录制(不限时长)
gst-launch-1.0 -q \
v4l2src device=/dev/video73 \
! image/jpeg,width=1280,height=720,framerate=25/1 \
! jpegdec ! videoconvert \
! videorate ! video/x-raw,framerate=25/1 \
! mpph264enc ! h264parse ! mp4mux \
! filesink location=long_record.mp42
3
4
5
6
7
按 Ctrl+C 停止录制。
Python 封装
import subprocess
import time
import os
def hw_record(device="/dev/video73", duration=10, output="hw_record.mp4"):
"""使用 MPP 硬件编码器录制 H.264 视频"""
num_buffers = duration * 25
cmd = [
'gst-launch-1.0', '-q',
'v4l2src', f'device={device}', f'num-buffers={num_buffers}',
'!', 'image/jpeg,width=1280,height=720,framerate=25/1',
'!', 'jpegdec', '!', 'videoconvert',
'!', 'videorate', '!', 'video/x-raw,framerate=25/1',
'!', 'mpph264enc', '!', 'h264parse', '!', 'mp4mux',
'!', 'filesink', f'location={output}'
]
print(f"Recording {duration}s...")
start = time.time()
subprocess.run(cmd, capture_output=True, text=True, timeout=duration + 15)
elapsed = time.time() - start
if os.path.exists(output):
size_mb = os.path.getsize(output) / (1024 * 1024)
print(f"Done: {elapsed:.1f}s / {size_mb:.1f}MB")
else:
print("Recording failed")
if __name__ == "__main__":
hw_record(duration=10)2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
运行:
~/opencv-env/bin/python3 hw_record.py实测对比数据
测试条件:1280×720,MJPG 25fps,录制 10 秒,多次取稳定值。
帧率对比(边录边显示)
| 方案 | 帧率 | 体验 |
|---|---|---|
| OpenCV imshow + VideoWriter(CPU 全干) | 14.3fps | 明显卡顿 |
| GStreamer tee + MPP(硬件编码) | 25.0fps | 满帧流畅 |
帧率提升原因
OpenCV 方案中 CPU 同时负责解码、编码、渲染三件事。MPP 方案中编码交给 VPU 硬件,CPU 负载大幅降低,有余力做其他实时处理。
文件大小对比
| 方案 | 文件大小 | 压缩比 | 说明 |
|---|---|---|---|
| OpenCV mp4v 软编码 | 12.8MB | 1.0x | 最简单,文件大 |
| GStreamer + MPP 硬编码 | 3.5MB | 3.6x | 推荐 |
| GStreamer MPP 全硬件 | 3.2MB | 3.9x | 略优,差异不大 |
| GStreamer tee(边看边录) | 3.5MB | 3.6x | 显示+录制两不误 |
原理简述
USB摄像头 → MJPG数据流 → jpegdec(CPU解码) → mpph264enc(VPU硬件编码) → MP4文件
↘ CPU 空出来跑你的算法2
| 组件 | 作用 |
|---|---|
jpegdec | CPU 软件解码 JPEG,开销很小 |
mpph264enc | RK3576 VPU 硬件做 H.264 编码,CPU 几乎不参与 |
videorate | 修正帧率元数据,确保播放速度正确 |
RK3576 硬件加速能力一览
| 硬件单元 | 用途 | 对应库 |
|---|---|---|
| VPU | H.264/H.265/JPEG 编解码 | MPP (librockchip_mpp) |
| NPU | AI 推理加速(人脸/目标检测) | RKNN (librknnrt) |
| RGA | 图像缩放、旋转、格式转换 | librga |
为什么不直接在 OpenCV 里用硬件编码
pip 安装的 opencv-python 是通用预编译包,不包含 GStreamer 后端。日常推荐:
- OpenCV → 图像处理、显示、算法(人脸检测、边缘检测等)
- GStreamer + MPP → 高效录制(硬件编码,不占 CPU)
两者各司其职,不需要重新编译任何东西。
如果确实需要源码编译 OpenCV(启用 GStreamer)
sudo apt install -y build-essential cmake git pkg-config \
libgtk2.0-dev libavcodec-dev libavformat-dev libswscale-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
librockchip-mpp-dev
git clone https://github.com/opencv/opencv.git --branch 4.10.0 --depth 1
cd opencv && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D WITH_GSTREAMER=ON \
-D WITH_FFMPEG=ON \
..
make -j4 # 约30-60分钟
sudo make install2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
常见问题
录制的视频播放速度不对(快进或慢放)
管道中必须加 videorate ! video/x-raw,framerate=25/1。本文所有命令已包含此修正。
gst-launch-1.0 找不到 mpph264enc
sudo apt install -y gstreamer1.0-rockchip压缩比和文档不一样
压缩比取决于画面内容。静态场景差异更大,动态场景差异更小。3.5~3.9x 是典型办公环境下的结果。
能不能同时用 OpenCV 做图像处理 + GStreamer 录制
可以,但同一个摄像头不能被两个进程同时打开。推荐方案:
- 用 GStreamer tee 管道做显示+录制(场景2 的命令)
- OpenCV 对录制好的视频做离线处理
对于大多数场景,直接用场景2 的 tee 命令就够了。