[RK3288][android7.1]修改USB摄像头预览像素分辨率

一,描述

  1. 使用USB摄像头,一般情况下厂商提供的USB摄像头会有内置固件,里面支持多种分辨率(一般可直接插在电脑上看到拍照以及录像的质量),如下图所示:
    在这里插入图片描述由上图可看出这款摄像头拍照支持的最大像素为1.9MP(大约200万像素),录像最大支持720P。
  2. adb shell下也可以通过命令获取摄像头的信息:
rk3288:/ $ dumpsys media.camera
Camera module HAL API version: 0x1
Camera module API version: 0x1
Camera module name: RK29_ICS_CameraHal_Module
Camera module author: RockChip
Number of camera devices: 1
Number of normal camera devices: 1
Active Camera Clients:
[]
Allowed users:
0
Vendor tags left unimplemented.

Prior client events (most recent at top):
  01-01 10:56:49 : DISCONNECT device 0 client for package com.android.camera3 (PID 1959)
  01-01 10:56:35 : CONNECT device 0 client for package com.android.camera3 (PID 1959)
  01-01 09:22:11 : DISCONNECT device 0 client for package com.android.camera3 (PID 1462)
  01-01 09:21:33 : CONNECT device 0 client for package com.android.camera3 (PID 1462)
  01-01 08:00:59 : DISCONNECT device 0 client for package com.android.camera3 (PID 1462)
  01-01 08:00:46 : CONNECT device 0 client for package com.android.camera3 (PID 1462)
  01-01 08:00:17 : DISCONNECT device 0 client for package cameraserver (PID 234)
  01-01 08:00:15 : USER_SWITCH previous allowed users:  , current allowed users: 0

Camera 0 information:
  Facing: BACK
  Orientation: 0
  Resource Cost: 100
  Conflicting Devices: NONE
  Device version: 0x100
  Camera1 API shim is using parameters:
        CameraParameters::dump: mMap.size = 50
        antibanding: off
        antibanding-values: off,50hz,60hz,auto
        exposure-compensation: 0
        exposure-compensation-step: 1
        focal-length: 35
        focus-distances: 0.3,50,Infinity
        focus-mode: fixed
        focus-mode-values: fixed
        horizontal-view-angle: 10
        jpeg-quality: 70
        jpeg-thumbnail-height: 128
        jpeg-thumbnail-quality: 50
        jpeg-thumbnail-size-values: 0x0,160x128
        jpeg-thumbnail-width: 160
        max-exposure-compensation: 3
        max-num-detected-faces-hw: 2
        max-num-detected-faces-sw: 0
        max-num-focus-areas: 0
        max-num-metering-areas: 0
        max-zoom: 40
        min-exposure-compensation: -3
        picture-format: jpeg
        picture-format-values: jpeg
        picture-size: 1600x1200
        picture-size-values: 640x480,320x240,160x120,352x288,176x144,1280x1024,1600x1200
        preferred-preview-size-for-video:
        preview-format: yuv420sp
        preview-format-values: yuv420sp,yuv420p
        preview-fps-range: 5000,30000
        preview-fps-range-values: (5000,30000)
        preview-frame-rate: 30
        preview-frame-rate-values: 30,15,7
        preview-size: 640x480
        preview-size-values: 640x480,320x240,160x120,352x288,176x144,1280x1024,1600x1200
        recording-hint: false
        rk-continous-pic-num: 1
        rk-previwe-h-force: 0
        rk-previwe-w-force: 0
        rotation: 0
        vertical-view-angle: 10
        video-frame-format: yuv420sp
        video-size:
        video-size-values:
        video-snapshot-supported: true
        video-stabilization-supported: false
        whitebalance: auto
        whitebalance-values: auto,incandescent,fluorescent,daylight,cloudy-daylight
        zoom: 0
        zoom-ratios: 100,105,110,115,120,125,130,135,140,145,150,155,160,165,170,175,180,185,190,195,200,205,210,215,220,225,230,235,240,
245,250,255,260,265,270,275,280,285,290,295,300,
        zoom-supported: true
  Device 0 is closed, no client instance

No active camera clients yet.

Camera traces (0):
  No camera traces collected.

二,问题现象

但是在Android系统上打开相机有时会发现拍照与录像预览时像素不清晰,分辨率并没有达到摄像头所支持的。通常情况下,预览分辨率是从设备 /data/camera/media_profiles.xml ( system/etc/media_profiles_default.xml)中配置的分辨率获取的。
可以修改对应的参数直接验证,方法如下:

adb root
adb remount
adb shell
busybox vi /data/camera/media_profiles.xml(编辑修改)
:wq(退出)
reboot


三,解决方法

如果需要在源码中(路径为/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp)指定,可以进行如下修改:

  1. 拍照时,修改默认的PreviewSize预览分辨率和PictureSize照片大小,自行定制预览分辨率,把1600x1200设为最大分辨率。
diff --git a/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp b/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp
index b565930a68..83a4888fa6 100755
--- a/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp
+++ b/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp
@@ -164,14 +164,14 @@ void CameraUSBAdapter::initDefaultParameters(int camFd)
     params.set(KEY_PREVIEW_W_FORCE,"0");
     params.set(KEY_PREVIEW_H_FORCE,"0");
-    params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, parameterString.string());
-    if(parameterString.contains("640x480"))
-        params.setPreviewSize(640,480);
+    params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES, "640x480,320x240,160x120,352x288,176x144,1280x1024,1600x1200");
+    if(parameterString.contains("1600x1200"))//如果1600x1200有包含在支持分辨率KEY_SUPPORTED_PREVIEW_SIZES中为真,setPreviewSize为1600x1200;
+        params.setPreviewSize(1600,1200);
     else
         params.setPreviewSize(mCamDriverFrmWidthMax,mCamDriverFrmHeightMax);
     /*picture size setting*/      
-    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, parameterString.string());        
-    params.setPictureSize(mCamDriverFrmWidthMax,  mCamDriverFrmHeightMax);        
+    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES, "640x480,320x240,160x120,352x288,176x144,1280x1024,1600x1200");
+    params.setPictureSize(1600,1200);
     
     /* set framerate */
     struct v4l2_streamparm setfps;
  1. 录像时,设置默认的KEY_SUPPORTED_VIDEO_SIZES,把1600x1200设为最大预览分辨率。

KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO:设置在录制视频时首选的预览尺寸
KEY_VIDEO_SIZE:设置相机的视频尺寸
KEY_SUPPORTED_VIDEO_SIZES:获取相机支持的视频尺寸列表

diff --git a/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp b/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp
index b565930a68..153d88407f 100755
--- a/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp
+++ b/hardware/rockchip/camera/CameraHal/CameraUSBAdapter.cpp
@@ -571,15 +571,15 @@ void CameraUSBAdapter::initDefaultParameters(int camFd)
#if (CONFIG_CAMERA_SETVIDEOSIZE == 0)
     if(false/*mIsCtsTest*/){
    
    
         if(gCamInfos[mCamId].facing_info.facing == CAMERA_FACING_BACK){
    
    
-             //back camera, may need to manually modify based on media_profiles.xml supported.
-             params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,"1920x1080");
-             params.set(CameraParameters::KEY_VIDEO_SIZE,"1920x1080");
-             params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,"176x144,320x240,352x288,640x480,1280x720,1920x1080");
+             //back camera(后置), may need to manually modify based on media_profiles.xml supported.
+             params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,"1600x1200");
+             params.set(CameraParameters::KEY_VIDEO_SIZE,"1600x1200");
+             params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,"1600x1200");
         }else{
    
    
-             //front camera
-             params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,"640x480");
-             params.set(CameraParameters::KEY_VIDEO_SIZE,"640x480");
-             params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,"176x144,320x240,352x288,640x480,1280x720");
+             //front camera(前置)
+             params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,"1600x1200");
+             params.set(CameraParameters::KEY_VIDEO_SIZE,"1600x1200");
+             params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,"1600x1200");
         }
     } else {
    
    
          params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,"");


以上为设置为1600x1200预览分辨率的方法,想要更换其他分辨率,可以通过如上方法修改自己需要指定的分辨率;
注:一定要在USB摄像头支持的分辨率中指定自己需要的分辨率!

猜你喜欢

转载自blog.csdn.net/weixin_45639314/article/details/131803967