RK3588平台USB摄像头调试实战:从报错到稳定运行

电子说

1.4w人已加入

描述

 

 

在嵌入式开发中,RK3588 凭借强劲的算力常被用于边缘计算、工业视觉等场景,而 USB 摄像头作为常见外设,调试过程中难免遇到各类 卡壳” 问题。最近我们在 RK3588 上调试 USB 摄像头时,先后遇到分辨率不兼容、预览静置崩溃等问题,最终通过针对性排查逐一解决。今天就把完整调试流程分享出来,帮大家少走弯路。

 

 

 

一、第一步:确认摄像头节点与支持格式

 

调试的前提是摸清” 摄像头的基础信息 —— 比如它在系统中对应的设备节点(videoX),以及实际支持的分辨率、格式。

 

 

1. 定位 USB 摄像头节点

 

通过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 摄像头节点(实际节点可能是 video1video2 等,以实际输出为准)。

 

 

2. 查看摄像头支持的格式与分辨率

 

确定节点后,用v4l2-ctl工具查看摄像头的详细能力(需提前安装 v4l-utils):

 

 

  •  
v4l2-ctl -d /dev/video0 --list-formats-ext

该命令会列出摄像头支持的像素格式(如 YUYVMJPEG)、分辨率、帧率等关键信息。我们此次调试的摄像头,从输出中明确看到最大支持 3840×2160 分辨率,这为后续排查问题埋下关键线索。

 

 

二、核心问题 1:分辨率不兼容导致报错

 

当我们打开相机录像预览时,系统直接抛出错误:

 

 

  •  
E CameraSource: Video dimension (4096x3072) is unsupported

明明摄像头最大只支持 3840×2160,为何系统会调用 4096×3072 的分辨率?问题出在媒体配置文件上。

 

 

1. 定位媒体配置文件来源

 

一开始我们尝试直接拉取设备上的配置文件查看:

 

 

  •  
adb pull /vendor/etc/media_profiles_V1_0.xml

但对比代码中的device/google/bonito/media_profiles_V1_0.xmldevice/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

 

 

2. 修改分辨率配置

 

打开/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:预览静置几分钟必现崩溃

 

解决分辨率问题后,新的异常出现:打开相机录像预览页面静置 2-5 分钟,必然会出现崩溃 —— 我们连续测试 次,100% 复现。

 

 

1. 定位问题根源:媒体处理库缺失

 

排查发现,RK3588 处理媒体编解码依赖libmpp.so库(Rockchip 多媒体处理库),当前系统中该库版本存在稳定性问题,导致长时间预览时资源泄漏或编解码异常。

 

 

2. 更新媒体库并验证

 

将附件中的最新libmpp.so库推送到设备指定路径,覆盖旧库:

 

 

  •  
  •  
adb push libmpp.so /vendor/lib/adb reboot  # 重启设备使库生效

重启后再次测试:打开预览页面静置 10 分钟以上,未出现任何崩溃 —— 静置异常问题彻底解决。

 

 

四、最终验证与 SDK 同步

 

问题解决后,需确保后续开发中不再出现类似问题,因此要将更新同步到 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 摄像头调试也遇到类似问题,不妨按照上述步骤排查。若有其他调试疑问,欢迎在评论区交流~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分