Android 相机预览是黑暗的

标签 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 Preview 我的相机应用 My Camera app

尝试根据此处发布的相机的 upack 参数设置 ISO 等。还是不行。

Parameters(16369): effect-values=none,mono,negative,sepia,aqua,sharpen,purple,green-tint,blue-tint,pink,yellow,red-tint,mono,antique;exposure-compensation-step=0.5;focal-length=3.43;focus-areas=(0,0,0,0,0);focus-distances=0.10,1.20,Infinity;focus-mode-values=auto,macro,facedetect;gps-altitude=0;gps-latitude=0;gps-longitude=0;gps-processing-method=GPS;gps-timestamp=0;horizontal-view-angle=51.2;iso=auto;iso-values=auto,ISO50,ISO100,ISO200,ISO400,ISO800,ISO1600;jpeg-quality=1;jpeg-thumbnail-height=480;jpeg-thumbnail-size-values=640x480,0x0;jpeg-thumbnail-width=640;max-exposure-compensation=4;max-num-focus-areas=1;max-zoom=12;min-exposure-compensation=-4;picture-format=jpeg;picture-format-values=jpeg;picture-size-values=2560x1920,2560x1536,2048x1536,2048x1232,1600x1200,1600x960,800x480,640x480;preview-format=yuv420sp;preview-format-values=yuv420sp;preview-fps-range=15000,30000;preview-fps-range-values=(15000,30000);preview-frame-rate=30;preview-frame-rate-values=30;preview-size=640x480;preview-size-values=1280x720,800x480,720x480,640x480,352x288;rotation=0;scene-mode=auto;scene-mode-values=auto,portrait,landscape,night,beach,snow,sunset,fireworks,sports,party,candlelight,asd,backlight,dusk-dawn,text,fall-color;vertical-view-angle=39.4;video-frame-format=yuv422i-yuyv;whitebalance-values=auto,incandescent,fluorescent,daylight,cloudy-daylight;zoom=0;zoom-ratios=100,125,150,175,200,225,250,275,300,325,350,375,400;zoom-supported=true;focus-mode=auto;picture-size=2560x1920;exposure-compensation=4;

编辑:根据下面的评论进行进一步测试后,似乎只是预览变得比应有的更暗。实际拍摄的图像光线充足,曝光补偿似乎工作正常。它只是让我头疼的预览。在运行 CM11 的 i9003 和运行 stock android 的 Nexus 10 上测试。

最佳答案

某些相机似乎存在错误报告支持的预览 FPS 范围的错误。您可以通过调用时返回相同最小值和最大值的设备来识别有问题的设备

getPreviewFpsRange (int[] 范围)

在我的例子中,我在报告 (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)

更稳健的方法是通过比较所有可用值来设置最小值和最大值。

关于Android 相机预览是黑暗的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39064357/

相关文章:

android - 警报对话框显示非常缓慢

android - navigator.camera.getPicture 不调用成功回调 - ionic framework - cordova

php - 使用 PHP 在浏览器中预览 PDF 文件

xml - Android Studio XML 上的 RTL 预览

android - RxJava 再次订阅后继续发射

java - 服务中的套接字 + 通知

android - Uri 中的 "Shadow"和 "high"字符串直接重定向到 Android 中的浏览器

ios - 如何用swift拍照并保存到app本地

iphone - 如何实时修改来自 iPhone 摄像头的视频流?

android - 卡住相机预览的方法