Android相机预览很暗

时间:2014-11-17 07:21:48

标签: android camera preview iso

我正在尝试创建自定义相机应用。我从这里跟随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 Stock Camera Preview 我的相机应用 My 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。

3 个答案:

答案 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=nightscene-mode=dusk-dawn

场景的问题在于支持的值不是跨设备标准化的。但是通常会出现某种night

答案 2 :(得分:1)

除了之前的答案,如果您正在进行

,可能会发生这种情况

createCaptureRequest(CameraDevice.TEMPLATE_RECORD)

更改为

createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)