保姆级教程:在RK3566开发板上用MPP库把摄像头YUV数据转成JPEG图片(附完整命令)

张开发
2026/5/4 4:40:37 15 分钟阅读

分享文章

保姆级教程:在RK3566开发板上用MPP库把摄像头YUV数据转成JPEG图片(附完整命令)
RK3566开发实战用MPP库实现YUV到JPEG的高效转换在智能摄像头和边缘计算设备开发中图像编码是核心环节之一。RK3566作为一款高性能嵌入式处理器其内置的媒体处理平台MPP为开发者提供了强大的硬件加速能力。本文将深入讲解如何利用MPP库中的mpi_enc_test工具将摄像头采集的NV12格式YUV数据高效转换为JPEG图像。1. 环境准备与交叉编译1.1 工具链配置RK3566开发通常需要在x86主机上进行交叉编译。首先确保已安装正确的工具链sudo apt-get install gcc-aarch64-linux-gnu g-aarch64-linux-gnu验证工具链版本aarch64-linux-gnu-gcc --version1.2 MPP源码获取与编译获取最新MPP源码git clone https://github.com/rockchip-linux/mpp.git cd mpp编辑交叉编译配置文件build/linux/aarch64/arm.linux.cross.cmake关键参数示例set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g) set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR aarch64)执行编译./make-Makefiles.bash make -j$(nproc)编译完成后关键产出文件librockchip_mpp.soMPP动态库test/mpi_enc_test编码测试工具2. 开发板环境部署2.1 库文件与工具部署将编译产物传输到开发板scp librockchip_mpp.so rootboard_ip:/usr/lib/ scp test/mpi_enc_test rootboard_ip:/usr/bin/设置库路径export LD_LIBRARY_PATH/usr/lib:$LD_LIBRARY_PATH2.2 摄像头数据采集以OV5648摄像头为例获取NV12格式数据v4l2-ctl --set-fmt-videowidth1920,height1080,pixelformatNV12 v4l2-ctl --stream-mmap3 --stream-count1 --stream-toframe.yuv常见分辨率对应的YUV文件大小分辨率NV12格式大小640x480460,800字节1280x7201,382,400字节1920x10803,110,400字节3. JPEG编码实战3.1 基础编码命令将YUV转换为JPEG的基本命令结构mpi_enc_test -w 宽度 -h 高度 -t 8 -i input.yuv -o output.jpg参数说明-w图像宽度必须与YUV文件实际宽度一致-h图像高度-t 8指定JPEG编码类型MPP中8代表JPEG-i输入YUV文件路径-o输出JPEG文件路径3.2 高级参数调优质量控制参数mpi_enc_test -w 1920 -h 1080 -t 8 -i frame.yuv -o high_quality.jpg -qc 90提示-qc参数范围通常为1-100默认75。值越高图像质量越好但文件体积越大性能统计参数mpi_enc_test -w 1280 -h 720 -t 8 -i frame.yuv -o output.jpg -v f典型日志输出分析mpi_enc_test: chn 0 encoded frame 0 size 125678 mpi_enc_test: chn 0 encode 1 frames time 8 ms delay 3 ms fps 120.34关键指标编码时间8ms实际编码处理耗时延迟时间3ms数据准备和传输耗时估算FPS120.34理论处理能力4. 实际应用中的问题排查4.1 常见错误与解决方案错误现象可能原因解决方法invalid width/height分辨率参数不匹配检查YUV文件实际分辨率failed to open input file文件路径错误使用绝对路径或确认文件权限encoder create failedMPP库未正确加载检查LD_LIBRARY_PATH设置输出图片颜色异常像素格式不匹配确认YUV是NV12格式4.2 性能优化技巧内存优化echo 512 /sys/block/zram0/disksize mkswap /dev/zram0 swapon /dev/zram0CPU频率锁定echo performance /sys/devices/system/cpu/cpufreq/policy0/scaling_governor批量处理脚本示例#!/bin/bash for i in {1..30}; do mpi_enc_test -w 1280 -h 720 -t 8 -i frame_$i.yuv -o out_$i.jpg done wait5. 扩展应用构建实时编码管道结合V4L2实现实时编码v4l2-ctl --stream-mmap --stream-count0 --stream-to- | \ while true; do dd bs1M count1 iflagfullblock ofchunk.yuv mpi_enc_test -w 1280 -h 720 -t 8 -i chunk.yuv -o $(date %s).jpg done网络传输优化方案mpi_enc_test -w 640 -h 480 -t 8 -i frame.yuv -o - | \ nc -l -p 8080在嵌入式视觉项目中合理配置MPP编码参数可以将JPEG编码延迟控制在10ms以内满足绝大多数实时性要求。实际测试中RK3566在1080p分辨率下单帧JPEG编码典型耗时约15-20ms而720p分辨率下可达到8-12ms。

更多文章