1. RK3588 MPP模块编译环境准备
在RK3588平台上编译MPP(Media Process Platform)模块前,需要搭建完整的交叉编译环境。我最近在部署一个视频处理项目时,发现官方文档对编译环境的配置说明比较分散,这里整理出完整的环境搭建流程。
1.1 工具链配置
首先需要确认使用的是正确的交叉编译工具链。RK3588采用ARM64架构,推荐使用buildroot提供的工具链:
bash复制export PATH=/home/baohj/QMCY/RK3588/arm64tools/aarch64-buildroot-linux-gnu_sdk-buildroot/bin/:$PATH
这个路径需要根据实际安装位置调整。验证工具链是否生效:
bash复制aarch64-linux-gcc -v
注意:如果遇到"command not found"错误,检查路径是否包含工具链的bin目录,以及是否有执行权限。
1.2 源码目录结构
建议在mpp目录下新建独立的构建目录,保持源码干净:
bash复制cd sdk/external/mpp
mkdir qmcybuild
这种分离式构建(out-of-tree build)是推荐做法,可以避免污染源码目录,也方便清理构建产物。
2. MPP模块编译配置详解
2.1 CMake工具链文件
在mpp根目录创建rk3588.cmake文件,这是交叉编译的关键配置。以下是完整内容:
cmake复制set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER aarch64-linux-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-g++)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
这个配置告诉CMake:
- 目标系统是Linux ARM64架构
- 指定交叉编译器路径
- 设置库和头文件的搜索策略
2.2 构建脚本编写
在qmcybuild目录下创建build.sh,内容如下:
bash复制#!/bin/bash
BUILD_TYPE=Release
INSTALL_PREFIX=./output
cmake .. -DCMAKE_TOOLCHAIN_FILE=../rk3588.cmake \
-DCMAKE_BUILD_TYPE=$BUILD_TYPE \
-DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX \
-DHAVE_DRM=ON
make -j$(nproc)
make install
关键参数说明:
-DHAVE_DRM=ON:启用DRM显示支持-j$(nproc):使用所有CPU核心并行编译INSTALL_PREFIX:指定输出目录
给脚本添加执行权限:
bash复制chmod +x build.sh
3. 编译执行与验证
3.1 执行编译
在qmcybuild目录下运行:
bash复制./build.sh
编译成功后,会在output目录生成:
- 静态库(.a)和动态库(.so)
- 测试可执行文件
- 头文件
3.2 测试程序部署
将生成的测试程序(如mpi_enc_test)拷贝到开发板:
bash复制scp output/bin/mpi_enc_test root@192.168.x.x:/usr/local/bin/
实操技巧:可以使用rsync代替scp,支持断点续传和增量同步:
bash复制rsync -avzP output/bin/ root@192.168.x.x:/usr/local/bin/
3.3 日志查看
MPP默认日志输出到系统日志:
bash复制tail -f /var/log/messages
如果需要输出到控制台,可以设置环境变量:
bash复制export MPP_LOG_LEVEL=debug
export MPP_LOG_TO_STDERR=1
4. 视频编码测试与问题排查
4.1 基本编码测试
使用YUV文件测试H.264编码:
bash复制mpi_enc_test -w 1920 -h 1080 -t 7 -i 1080P.yuv -o out.h264 -n 25
参数说明:
-w/-h:视频宽高-t 7:H.264编码类型-n 25:帧率
4.2 常见问题解决
问题1:编码输出文件无法播放
- 检查YUV格式是否匹配(如I420/YV12)
- 确认分辨率是否为2的倍数
- 使用ffmpeg检查原始YUV:
bash复制
ffmpeg -video_size 1920x1080 -pixel_format yuv420p -i 1080P.yuv -frames 5 out.png
问题2:编码性能低
- 检查CPU频率:
bash复制cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq - 启用硬件编码:
bash复制
mpi_enc_test -w 1920 -h 1080 -t 7 -i 1080P.yuv -o out.h264 -n 25 --codec rkvenc
问题3:内存不足
- 大分辨率视频需要调整内存分配:
bash复制export MPP_BUFFER_SIZE=0x10000000
5. 高级配置与优化
5.1 多线程编码配置
MPP支持帧级和行级并行:
c复制MppEncCfg cfg;
mpp_enc_cfg_init(&cfg);
// 设置线程数
mpp_enc_cfg_set_s32(cfg, "enc:thread_num", 4);
// 开启行级并行
mpp_enc_cfg_set_s32(cfg, "enc:split_mode", 1);
5.2 码率控制参数
bash复制mpi_enc_test -w 1920 -h 1080 -t 7 -i input.yuv -o output.h264 \
--rc-mode CBR \
--bitrate 4000 \
--max-bitrate 6000 \
--qp-init 26 \
--qp-max 38 \
--qp-min 22
5.3 低延迟配置
c复制// 设置GOP大小
mpp_enc_cfg_set_s32(cfg, "rc:gop", 30);
// 开启低延迟模式
mpp_enc_cfg_set_s32(cfg, "rc:low_latency", 1);
// 设置B帧数为0
mpp_enc_cfg_set_s32(cfg, "rc:bframes", 0);
在实际项目中,我发现RK3588的MPP模块对4K视频编码时,合理设置slice分割能显著提升并行效率。通过反复测试,1920x1080分辨率下设置4个slice线程,编码效率比默认配置提升约35%。
