RK3588平台USB摄像头调试实战:从报错到稳定运行 电子说
在嵌入式开发中,RK3588 凭借强劲的算力常被用于边缘计算、工业视觉等场景,而 USB 摄像头作为常见外设,调试过程中难免遇到各类 “卡壳” 问题。最近我们在 RK3588 上调试 USB 摄像头时,先后遇到分辨率不兼容、预览静置崩溃等问题,最终通过针对性排查逐一解决。今天就把完整调试流程分享出来,帮大家少走弯路。
调试的前提是“摸清” 摄像头的基础信息 —— 比如它在系统中对应的设备节点(videoX),以及实际支持的分辨率、格式。
通过sysfs文件系统可快速找到摄像头对应的节点,执行以下命令:
grep '' /sys/class/video4linux/video*/name
命令会输出所有视频设备的名称,比如:
/sys/class/video4linux/video0/name: USB Camera: USB Camera/sys/class/video4linux/video1/name: rkisp-statistics
其中标注“USB Camera” 的video0就是我们要调试的 USB 摄像头节点(实际节点可能是 video1、video2 等,以实际输出为准)。
确定节点后,用v4l2-ctl工具查看摄像头的详细能力(需提前安装 v4l-utils):
v4l2-ctl -d /dev/video0 --list-formats-ext
该命令会列出摄像头支持的像素格式(如 YUYV、MJPEG)、分辨率、帧率等关键信息。我们此次调试的摄像头,从输出中明确看到最大支持 3840×2160 分辨率,这为后续排查问题埋下关键线索。
当我们打开相机录像预览时,系统直接抛出错误:
E CameraSource: Video dimension (4096x3072) is unsupported
明明摄像头最大只支持 3840×2160,为何系统会调用 4096×3072 的分辨率?问题出在媒体配置文件上。
一开始我们尝试直接拉取设备上的配置文件查看:
adb pull /vendor/etc/media_profiles_V1_0.xml
但对比代码中的device/google/bonito/media_profiles_V1_0.xml和device/google/crosshatch/media_profiles_V1_0.xml时,发现差异极大—— 这两个文件并非 RK3588 实际使用的配置。
经过排查发现:RK3588 编译时会将
/device/rockchip/media_profiles_defaults.xml
拷贝到/vendor/etc/media_profiles_V1_0.xml,也就是说,真正生效的配置文件是media_profiles_defaults.xml
打开/device/rockchip/media_profiles_defaults.xml,找到对应录像配置的VideoProfile节点,发现其中错误配置了分辨率:
<VideoProfile name="4K" codec="h264" width="4096" height="3072" bitRate="100000000" frameRate="30"/>
将分辨率修改为摄像头实际支持的 3840×2160:
<VideoProfile name="4K" codec="h264" width="3840" height="2160" bitRate="100000000" frameRate="30"/>
修改后重新编译固件并烧录,分辨率不兼容的报错消失。
解决分辨率问题后,新的异常出现:打开相机录像预览页面静置 2-5 分钟,必然会出现崩溃 —— 我们连续测试 5 次,100% 复现。
排查发现,RK3588 处理媒体编解码依赖libmpp.so库(Rockchip 多媒体处理库),当前系统中该库版本存在稳定性问题,导致长时间预览时资源泄漏或编解码异常。
将附件中的最新libmpp.so库推送到设备指定路径,覆盖旧库:
adb push libmpp.so /vendor/lib/adb reboot # 重启设备使库生效
重启后再次测试:打开预览页面静置 10 分钟以上,未出现任何崩溃 —— 静置异常问题彻底解决。
问题解决后,需确保后续开发中不再出现类似问题,因此要将更新同步到 SDK:
将验证通过的libmpp.so库更新到 SDK 的以下路径:
vendor/rockchip/common/vpu/lib/libmpp/arm/mpp_dev
同步后重新编译整个项目,多次测试确认:
1.摄像头预览长时间静置无崩溃;
2.录像分辨率正常(3840×2160),无报错;
3.重启设备后配置与库均生效。
1.节点确认是基础:遇到摄像头识别问题,先通过sys/class/video4linux路径确认节点,避免操作错误设备;
2.配置文件别找错:RK3588 平台优先看/device/rockchip/media_profiles_defaults.xml,而非 Google 设备的配置文件;
3.库版本要匹配:媒体相关问题(如预览崩溃、编解码失败),优先检查libmpp.so等核心库的版本,确保与硬件适配;
4.验证要“极端”:类似静置崩溃的问题,需多次长时间测试,避免偶发问题遗漏。
如果你的 RK3588 USB 摄像头调试也遇到类似问题,不妨按照上述步骤排查。若有其他调试疑问,欢迎在评论区交流~
全部0条评论
快来发表一下你的评论吧 !