我正在尝试创建自定义相机应用。我从这里跟随Android Developer示例进行了一些小调整。但是,我的相机预览结果相当暗。另一方面,相机提供了更加明亮的预览。
我已经尝试了几种设置,以使其更好地工作,但似乎没有任何影响。相关代码发布在这里。
CameraActivity(主要)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_camera);
if(CameraHelper.checkCameraHardware(this)) {
mHelper = new CameraHelper(this, getWindowManager().getDefaultDisplay());
}
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
mPreview = new CameraPreview(this, CameraHelper.camera);
mPreview.setLayoutParams(new LayoutParams(CameraHelper.mSize.width, CameraHelper.mSize.height, Gravity.CENTER));
preview.addView(mPreview);
}
CameraHelper类(初始化相机并设置默认参数)
public CameraHelper(CameraListener listener, Display display){
mListener = listener;
camera = getCameraInstance();
mParameters = camera.getParameters();
initCameraParameters();
mSize = getPreviewSize(display);
mParameters.setFocusMode(Parameters.FOCUS_MODE_AUTO);
mParameters.setPictureSize(2560, 1920);
mParameters.setAutoExposureLock(false);
mParameters.setAutoWhiteBalanceLock(false);
mParameters.set("iso", "ISO800"); //Tried with 400, 800, 600 (values obtained from flatten())
mParameters.setColorEffect("none");
mParameters.setPictureSize(2560, 1920);
mParameters.setPreviewFrameRate(20);
mParameters.set("scene-mode", "auto");
mParameters.setFocusMode("auto");
mParameters.setExposureCompensation(4);
camera.setParameters(mParameters);
}
相机将帧从上面开发者页面链接的示例发送到SurfaceHolder.Surface。
在这里看到差异: Stock Camera App 我的相机应用
尝试根据此处发布的摄像机的upack参数设置ISO等。它仍然无效。
参数(16369): 效应值=无,单声道,负,棕褐色,浅绿色,锐化,紫色,绿色,蓝色的色调,粉红色,黄色,红色色调,单声道,古董;曝光补偿步= 0.5;焦距= 3.43;对焦区=(0,0,0,0,0);对焦距离= 0.10,1.20,无穷远;将对焦模式值=汽车,宏,facedetect; GPS海拔= 0; GPS纬度= 0; GPS的经度= 0; GPS处理法=全球定位系统; GPS时间戳= 0;水平视角= 51.2; ISO =汽车;异值=汽车,ISO50,ISO100,ISO200,ISO400,ISO800, ISO1600; JPEG-质量= 1; JPEG缩略图高度= 480; JPEG缩略图大小的值= 640x480,0x0; JPEG缩略图宽度= 640;最大曝光补偿= 4; MAX-NUM-FOCUS-区域= 1;最大变焦= 12;最小曝光补偿= -4;画面格式= JPEG;画面格式值= JPEG;图像尺寸值= 2560x1920,2560x1536,2048x1536,2048x1232,1600x1200,1600x960 ,800x480,640x480;预览格式= yuv420sp;预览格式值= yuv420sp;预览FPS-范围= 15000,30000;预览FPS-范围值=(15000,30000);预览帧率= 30 ;预览帧率值= 30;预览大小640×480 =;预览 - 大小 - 值= 12 80x720,800x480,720x480,640x480,352x288;旋转= 0;场景模式=自动,场景模式值=自动,肖像,风景,夜景,海滩,雪景,夕阳,烟火,运动,派对,烛光,房间隔缺损,背光源,黄昏黎明,文本,水落颜色;垂直视角= 39.4;视频帧格式= yuv422i-YUYV;最大光圈值=汽车,白炽灯,荧光灯,日光,阴天,日光;变焦= 0;变焦比= 100,125,150,175,200,225,250,275,300,325,350,375,400;变焦支持= TRUE;将对焦模式自动=;图像尺寸= 2560x1920;曝光补偿= 4;
编辑:根据下面的评论进行进一步测试后,看起来它的预览变得比应该更暗。实际捕获的图像光线充足,曝光补偿似乎工作正常。它只是让我头疼的预览。在运行CM11和Nexus 10的i9003上运行测试android。
答案 0 :(得分:12)
某些相机错误地报告支持的预览FPS范围似乎存在错误。您可以通过在调用
时返回相同的min和max值来识别有问题的设备 getPreviewFpsRange (int[] range)
就我而言,我在报告(15000, 15000)
和(30000, 30000)
的设备上看到了这个问题,但是对于价值不同的设备,我没有看到这个问题,例如(7000, 30000)
。
我能找到的最佳解决方案是确定支持的FPS范围,该范围具有不同的最小值和最大值,并设置:
Camera.Parameters params = camera.getParameters();
final int[] previewFpsRange = new int[2];
params.getPreviewFpsRange(previewFpsRange);
if (previewFpsRange[0] == previewFpsRange[1]) {
final List<int[]> supportedFpsRanges = params.getSupportedPreviewFpsRange();
for (int[] range : supportedFpsRanges) {
if (range[0] != range[1]) {
params.setPreviewFpsRange(range[0], range[1]);
break;
}
}
}
camera.setParameters(params);
这是有效的,因为报告的范围似乎只有1项具有实际范围。例如:
BLU Vivo XL:
preview-fps-range=30000,30000
preview-fps-range-values=(15000,15000),(20000,20000),(24000,24000),(5000,30000),(30000,30000)
像素:
preview-fps-range=7000,30000
preview-fps-range-values=(15000,15000),(24000,24000),(7000,30000),(30000,30000)
更强大的方法是通过比较所有可用的来设置最小值和最大值。
答案 1 :(得分:1)
从我的实验中,scene-mode
设置可以更改预览(与ISO或曝光补偿不同,它们都适用于拍摄的图片)。不要使用auto
。试试scene-mode-values=night
或scene-mode=dusk-dawn
。
场景的问题在于支持的值不是跨设备标准化的。但是通常会出现某种night
。
答案 2 :(得分:1)
除了之前的答案,如果您正在进行
,可能会发生这种情况
createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
更改为
createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)