三星Galaxy S5相机闪光灯问题

时间:2014-10-11 19:14:06

标签: android camera android-camera

我正在开发具有自定义相机功能的应用。相机在Galaxy S3,S4,HTC,Nexus上工作正常,但在S5上,所有需要闪光灯的照片都会变暗。预览中的照片看起来很好,闪光灯闪光,但传感器拍摄的照片总是太暗,好像闪光灯从未闪光,闪光灯的闪光和图像捕捉在不同时间发生。闪光灯可以设置为自动或始终开启,效果相同。我尝试过FOCUS_MODE_CONTINUOUS_PICTURE和FOCUS_MODE_AUTO,结果相同。

有没有人有任何建议?

谢谢你, 加里

2 个答案:

答案 0 :(得分:8)

似乎这里有两个无关的错误,一个在Nexus 4上,另一个在三星S5上。它们似乎都表现为相同的问题,在低光照条件下拍摄的照片在闪光灯上显得非常暗,但根本原因却截然不同。

Nexus 4

将连续对焦与闪光灯配合使用时,Nexus 4会断开。这似乎是relatively well known issue,唯一的解决方案似乎是使用FOCUS_MODE_AUTO而不是FOCUS_MODE_CONTINUOUS_PICTURE。根本原因似乎与在闪光灯有机会射击之前过早拍照有关。

据我所知,Nexus 4是唯一需要这种特殊外壳的设备(即它报告支持FOCUS_MODE_CONTINUOUS_PICTURE,但可以用它来打破它。)

// dummy method, replace with wherever you setup camera params
public void onCameraOpened(Camera camera) {
    Camera.Parameters params = camera.getParameters();

    setFocusModeParameter(
        params,
        Build.MODEL.equals("Nexus 4")
            ? new String[] {
                Camera.Parameters.FOCUS_MODE_AUTO
            }
            : new String[] {
                Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE,
                Camera.Parameters.FOCUS_MODE_AUTO,
            }
    );

    camera.setParameters(params);
}

public static void setFocusModeParameter(Camera.Parameters params, String... preferences) {
    List<String> supported_focus_modes = params.getSupportedFocusModes();
    if (supported_focus_modes == null) {
        return;
    }

    for (String pref : preferences) {
        if (supported_focus_modes.contains(pref)) {
            params.setFocusMode(pref);
            return;
        }
    }
}

三星S5

与Nexus 4不同,三星S5似乎落后于闪光灯,导致黑暗画面。据我所知,打开隐藏的零快门滞后参数(以健壮的部分描述的安全方式)似乎对以下设备没有任何不良影响:Nexus 4,Nexus 5,Samsung S3,Samsung S4,Samsung Galaxy Tab S(SM-T700)。

打开零快门延迟

尝试设置以下隐藏的摄像头参数,这似乎解决了我的S5问题。

Camera.Parameters params = camera.getParameters();
params.set("zsl", "on");
camera.setParameters(params);

更强大的解决方案

如果上述解决方案有效,我会使用稍微强大的方法来检测zsl参数何时可用:

// dummy method, replace with whatever sets up camera parameters
public void onCameraOpened(Camera camera) {
    Camera.Parameters params = camera.getParameters();
    setHiddenParameter(params, "zsl-values", "zsl", "on");
    camera.setParameters(params);
}

public static void setHiddenParameter(Camera.Parameters params, String values_key, String key, String value) {
    if (params.get(key) == null) {
        return;
    }

    String possible_values_str = params.get(values_key);
    if (possible_values_str == null) {
        return;
    }

    String[] possible_values = possible_values_str.split(",");
    for (String possible : possible_values) {
        if (possible.equals(value)) {
            params.set(key, value);
            return;
        }
    }
}

说明

这部分只是为了记录兔子洞来找到这个参数,希望有人比我更了解这个参数。

症状:

  • 在Samsung S5上,在闪光灯设置为FLASH_MODE_ONFLASH_MODE_AUTO的极暗条件下拍摄照片会导致照片变暗或完全变黑。
  • 我测试的任何其他设备(Nexus 4,Nexus 5,Samsung S3,Samsung S4)似乎都没有发生这种情况。
  • 如果我在一个完全黑暗的房间里靠近物体(~3英尺)拍照,我会得到一张极其黑暗的照片,只有几件可见的东西。
  • 如果我在一个完全黑暗的房间里的空地(> 5英尺)前拍照,我会得到一张完全黑色的照片。

我尝试的第一件事就是弄乱焦点相关的设置,推断开放空间会导致焦点花费更长时间,从而弄乱用闪光灯拍摄照片的时机。 FOCUS_MODE_AUTOFOCUS_MODE_CONTINUOUS_PICTURE似乎都无助于这种情况。

我还尝试在调用camera.takePicture(...)之前锁定自动曝光和自动白平衡调整,以确保这些过程不会关闭闪光时间,但这似乎也无济于事。

但它仍然感觉像是一个计时问题,所以我开始比较我的应用程序使用的参数与本机相机应用程序之间的参数差异。

原生相机

12-10 15:49:08.659: W/QCameraParameters(265): [FW_DBG] setFirmwareMode: none
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] Requested preview size 1920 x 1080
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] dualrecording-hint : 0 m_FaceAE=1 Camera ID=0
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] Requested video size 1920 x 1080
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] Requested picture size 2048 x 1152
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] Requested FOV 62.000000
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] requested jpeg thumbnail size 512 x 288
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] set optimal jpeg thumbnail size 512 x 288
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] rotation val = 90
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] m_bNoDisplayMode = 0
12-10 15:49:08.659: W/QCameraParameters(265): setZslMode : m_nDualMode=0, mHdrMode=0, mTakeLowlight=0, m_bRecordingHint=0, mAutoLLS=0, m_nDualRecordingHint=0
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] ZSL = ON
12-10 15:49:08.659: I/QCameraParameters(265): [PARM_DBG] Requested FpsRange Values:(15000, 30000)
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] flash mode = on
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] AEC lock = false
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] AWB lock = false
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] mHdrMode 0 mTakeLowlight 0
12-10 15:49:08.659: E/QCameraParameters(265): SAMSUNG APPS HDR MODE
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] live snapshot size 2048 x 1152
12-10 15:49:08.659: E/QCameraParameters(265): [syscamera][setRthdrModes::2831][str::off][prev_str::off]
12-10 15:49:08.659: E/QCameraParameters(265): [syscamera][setPafModes::2863][str::on][prev_str::on]
12-10 15:49:08.659: E/QCameraParameters(265): [syscamera][setDrcModes::2891][str::on][prev_str::on]
12-10 15:49:08.659: W/QCameraParameters(265): updateParameters : X - mCameraId=0, final_rc=0, line=4465
12-10 15:49:08.659: W/QCameraParameters(265): [PARM_DBG] setNumOfSnapshot : nBurstNum = 1, nExpnum = 1

我的应用

12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] Requested preview size 1920 x 1080
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] dualrecording-hint : 0 m_FaceAE=1 Camera ID=0
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] Requested video size 1920 x 1080
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] Requested picture size 2048 x 1152
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] Requested FOV 62.000000
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] requested jpeg thumbnail size 512 x 288
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] set optimal jpeg thumbnail size 512 x 288
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] m_bNoDisplayMode = 0
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] ZSL = off
12-10 15:48:33.109: I/QCameraParameters(265): [PARM_DBG] Requested FpsRange Values:(10000, 30000)
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] flash mode = on
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] AEC lock = false
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] AWB lock = false
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] mHdrMode 0 mTakeLowlight 0
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] live snapshot size 2048 x 1152
12-10 15:48:33.109: E/QCameraParameters(265): [syscamera][setPafModes::2863][str::off][prev_str::off]
12-10 15:48:33.109: E/QCameraParameters(265): [syscamera][setDrcModes::2891][str::off][prev_str::off]
12-10 15:48:33.109: W/QCameraParameters(265): updateParameters : X - mCameraId=0, final_rc=0, line=4465
12-10 15:48:33.109: W/QCameraParameters(265): [PARM_DBG] setNumOfSnapshot : nBurstNum = 1, nExpnum = 1

原生与我的应用

AEC(自动曝光)和AWB(白平衡)线是相同的,因此与我之前尝试过的一致。一个区别是ZSL参数,我以前从未听说过。

谷歌搜索ZSL找到这个SO answer

  

要实现零快门延迟,相机驱动程序必须保持包含全分辨率帧的小型循环缓冲池。以传感器速率捕获图像并将其发送到预览和循环缓冲池(作为原始拜耳或处理/半处理的YUV)。当用户按下快门时,循环池中的最新缓冲区被提取,处理并压缩为JPEG。在较旧的手机相机上,传感器无法以足够高的帧速率捕获全分辨率帧,因此无法实现ZSL。

因此,快门延迟似乎会导致闪光灯闪光和拍摄照片时的时序不匹配。打开ZSL似乎完全消除了这个问题。默认情况下它可能会打开,因为如果没有它就会破坏闪存行为,但我不会屏住呼吸。

答案 1 :(得分:0)

我在三星Galaxy S5上解决了它。我有相机,设置(左上角)并关闭闪光灯以外的一切。现在它需要图片闪烁时(而不是它闪烁后)。图片清晰明亮。 有关更多信息,这是我的设置,在我关闭所有内容后自动进入。 16M图片大小5312X2988 爆裂射击关闭 低光检测关闭 人脸检测关闭 ISD AUTO ISO自动 测光模式中央重点 点击即可拍摄照片 选择性的焦点 效果没有效果 闪光 定时器关闭 hdr(丰富的音调)关闭 计量模式中心加权