当前位置: 首页 > article >正文

RK3568 android11 usb摄像头预览分辨率添加多分辨率---解除1080p限制

一,描述

UVC(USB Video Class)是一种 USB 设备类标准,允许通过 USB 连接的视频设备(如摄像头、网络摄像头和其他视频捕捉设备)与计算机或其他主机设备进行通信。UVC 使得视频设备的使用变得更加简单和通用,因为它不需要特定的驱动程序,主机操作系统通常可以直接识别和使用这些设备。

UVC 的主要特点

  1. 即插即用:
    UVC 设备可以在连接到主机时自动识别,无需安装额外的驱动程序。这使得用户能够快速方便地使用视频设备。
  2. 跨平台支持:
    UVC 设备通常可以在多种操作系统上工作,包括 Windows、macOS 和 Linux。这种跨平台的兼容性使得 UVC 成为视频设备的标准选择。
  3. 视频格式支持:
    UVC 支持多种视频格式和分辨率,包括 MJPEG、YUY2、H.264 等。设备可以根据主机的能力和应用程序的需求选择合适的格式。
  4. 控制功能:
    UVC 设备通常支持多种控制功能,例如亮度、对比度、饱和度、焦距等。这些控制可以通过 USB 接口进行调整。
  5. 流媒体支持:
    UVC 设备可以用于实时视频流传输,适用于视频会议、直播、监控等应用场景。

二,问题现象

把摄像头接入到PC上,会发现实际支持的最大预览分辨率是:4656x3496,但是Android系统中显示支持的分辨率却没有,最大是1920x1080。缺少的分辨率为什么没有?到哪里去了?

使用 v4l2-ctl 命令行工具来列出连接的 UVC 设备:

1.列出所有视频设备

v4l2-ctl --list-devices

rk3568:/ # v4l2-ctl --list-devices
rkisp-statistics (platform: rkisp):
        /dev/video12
        /dev/video13
        /dev/video21
        /dev/video22

rkcif (platform:rkcif_mipi_lvds):
        /dev/video0
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/video4

rkisp_mainpath (platform:rkisp-vir0):
        /dev/video5
        /dev/video6
        /dev/video7
        /dev/video8
        /dev/video9
        /dev/video10
        /dev/video11

rkisp_mainpath (platform:rkisp-vir1):
        /dev/video14
        /dev/video15
        /dev/video16
        /dev/video17
        /dev/video18
        /dev/video19
        /dev/video20

HK 16M CAM: HK 16M CAM (usb-xhci-hcd.2.auto-1):
        /dev/video23
        /dev/video24

2. 获取特定设备的支持格式

v4l2-ctl --device=/dev/video23 --list-formats

rk3568:/ # v4l2-ctl --device=/dev/video23 --list-formats
ioctl: VIDIOC_ENUM_FMT
        Index       : 0
        Type        : Video Capture
        Pixel Format: 'MJPG' (compressed)
        Name        : Motion-JPEG

        Index       : 1
        Type        : Video Capture
        Pixel Format: 'YUYV'
        Name        : YUYV 4:2:2

3. 设备支持分辨率

v4l2-ctl -d /dev/video23 --list-framesizes=YUYV

rk3568:/ # v4l2-ctl -d /dev/video23  --list-framesizes=YUYV
ioctl: VIDIOC_ENUM_FRAMESIZES
        Size: Discrete 1920x1080
        Size: Discrete 4656x3496
        Size: Discrete 4208x3120
        Size: Discrete 4160x3120
        Size: Discrete 4000x3000
        Size: Discrete 3264x2448
        Size: Discrete 2592x1944
        Size: Discrete 2320x1744
        Size: Discrete 2304x1728
        Size: Discrete 2048x1536
        Size: Discrete 1600x1200
        Size: Discrete 1280x960
        Size: Discrete 1280x720
        Size: Discrete 1024x768
        Size: Discrete 800x600
        Size: Discrete 640x480

三,解决办法

1.关于摄像头部分的源码目录:

#SDK 接口
frameworks/base/core/java/android/hardware/Camera.java
frameworks/base/core/jni/android_hardware_Camera.cpp

#上层 Camera 服务
frameworks/av/camera/

# HAL层
hardware/rockchip/camera
hardware/interfaces/camera/

# 配置文件,对应USB和CSI之类的摄像头配置
# 包含了支持分辨率,闪光灯等等的一些特性。
device/rockchip/common/external_camera_config.xml
hardware/rockchip/camera/etc/camera/

预览的限制主要存在于HAL和framework层。

2.device

源码路径:device/rockchip/common/external_camera_config.xml

FpsList中增加对应缺少的分辨率:

diff --git a/device/rockchip/common/external_camera_config.xml b/device/rockchip/common/external_camera_config.xml
index d377826d4e..ce604a4076 100755
--- a/device/rockchip/common/external_camera_config.xml
+++ b/device/rockchip/common/external_camera_config.xml
@@ -64,6 +64,7 @@
             <Limit  width="2592" height="1944" fpsBound="15.0" />
             <Limit  width="2592" height="1944" fpsBound="10.0" />
             <Limit  width="2592" height="1944" fpsBound="5.0" />
+           <Limit  width="4656" height="3496" fpsBound="30.0" />
             <!-- image size larger than the last entry will not be supported-->
         </FpsList>
         <!-- orientation -->

3.HAL

源码路径:hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp

diff --git a/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp b/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
index 55a2c3d08d..d3eb278093 100644
--- a/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
+++ b/hardware/interfaces/camera/device/3.4/default/RgaCropScale.cpp
@@ -21,21 +21,21 @@
namespace android {
namespace camera2 {
-#if (defined(TARGET_RK32) || defined(TARGET_RK3368))
+//#if (defined(TARGET_RK32) || defined(TARGET_RK3368))
#define RGA_VER (2.0)
#define RGA_ACTIVE_W (4096)
#define RGA_VIRTUAL_W (4096)
#define RGA_ACTIVE_H (4096)
#define RGA_VIRTUAL_H (4096)
-#else
-#define RGA_VER (1.0)
-#define RGA_ACTIVE_W (2048)
-#define RGA_VIRTUAL_W (4096)
-#define RGA_ACTIVE_H (2048)
-#define RGA_VIRTUAL_H (2048)
+//#else
+//#define RGA_VER (1.0)
+//#define RGA_ACTIVE_W (2048)
+//#define RGA_VIRTUAL_W (4096)
+//#define RGA_ACTIVE_H (2048)
+//#define RGA_VIRTUAL_H (2048)
-#endif
+//#endif
int RgaCropScale::CropScaleNV12Or21(struct Params* in, struct Params* out)

4.frameworks

源码路径:frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
上层接口解除1080P的限制。

diff --git a/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h b/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
index 3a709c9791..163d060b81 100644
--- a/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
+++ b/frameworks/av/services/camera/libcameraservice/api1/client2/Parameters.h
@@ -199,11 +199,11 @@ struct Parameters {
     // Max preview size allowed
     // This is set to a 1:1 value to allow for any aspect ratio that has
     // a max long side of 1920 pixels
-    static const unsigned int MAX_PREVIEW_WIDTH = 1920;
-    static const unsigned int MAX_PREVIEW_HEIGHT = 1920;
+    static const unsigned int MAX_PREVIEW_WIDTH = 4656;
+    static const unsigned int MAX_PREVIEW_HEIGHT = 3496;
     // Initial max preview/recording size bound
-    static const int MAX_INITIAL_PREVIEW_WIDTH = 1920;
-    static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080;
+    static const int MAX_INITIAL_PREVIEW_WIDTH = 4656;
+    static const int MAX_INITIAL_PREVIEW_HEIGHT = 3496;
     // Aspect ratio tolerance
     static const CONSTEXPR float ASPECT_RATIO_TOLERANCE = 0.001;
     // Threshold for slow jpeg mode

至此,系统相机—设置—分辨率与画质,就可以看到对应的最大的分辨率;


http://www.kler.cn/news/303344.html

相关文章:

  • 实现绑定UDP端口的Server程序
  • 大模型微调 - 基于预训练大语言模型的对话生成任务 训练代码
  • 计算机二级自学笔记(选择题1部分)
  • git的快速合并fast-forward merge详解
  • 机器学习和深度学习存在显著区别
  • LeetCode 热题 100 回顾11
  • 【系统架构设计师】ATAM(Architecture Tradeoff Analysis Method)
  • 【免费刷题】实验室安全第一知识题库分享
  • 简单了解深度学习
  • postcss-pxtorem实现页面自适应
  • python爬虫--实用又便捷的第三方模块--requests实战
  • 架构师知识梳理(七):软件工程-测试
  • 【智路】智路OS Perception Pipeline
  • 文件批量添加水印和密码合并单元格完整版
  • Python基础语法(2)
  • 【运维监控】Prometheus+grafana监控spring boot 3运行情况
  • 实现快速产出的短视频剪辑工具
  • Object.entries()
  • 力扣之1783.大满贯数量
  • zabbix之钉钉告警
  • SpringMVC与SpringBoot的区别
  • Docker续9:使用docker-compose部署nmt项目,在haproxy中代理mysql负载均衡
  • k8s的搭建
  • 【Clickhouse】Clickhouse数据库简介
  • mysql 日志恢复
  • Python数据分析与可视化基础教程
  • Linux系统下配置和测试Redis服务
  • 探索未来住宿体验:酒店触摸开关的科技魅力
  • 【API安全】威胁猎人发布超大流量解决方案
  • SVN的使用技巧