一,描述
- 使用USB摄像头,一般情况下厂商提供的USB摄像头会有内置固件,里面支持多种分辨率(一般可直接插在电脑上看到拍照以及录像的质量),如下图所示:
由上图可看出这款摄像头拍照支持的最大像素为1.9MP(大约200万像素),录像最大支持720P。 - 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
)指定,可以进行如下修改:
- 拍照时,修改默认的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;
- 录像时,设置默认的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摄像头支持的分辨率中指定自己需要的分辨率!