三星Galaxy S5相机闪光灯问题

Gar*_*nis 7 camera android android-camera

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

有没有人有什么建议可以尝试?

谢谢你,加里

rra*_*val 9

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

Nexus 4

将连续对焦与闪光灯配合使用时,Nexus 4会断开.这似乎是一个相对众所周知的问题,唯一的解决方案似乎是使用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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

三星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);
Run Code Online (Sandbox Code Playgroud)

更强大的解决方案

如果上面的解决方案有效,我会使用一种更健壮的方法来检测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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

说明

这部分只是为了记录兔子洞来找到这个参数,希望知道比我更多的人可以扩展这个.

症状:

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

我尝试的第一件事就是弄乱焦点相关的设置,推断开放空间会导致焦点花费更长时间,从而弄乱用闪光灯拍摄照片的时机.似乎也FOCUS_MODE_AUTO没有FOCUS_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
Run Code Online (Sandbox Code Playgroud)

我的应用程序

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
Run Code Online (Sandbox Code Playgroud)

原生与我的应用

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

谷歌搜索ZSL找到这个答案:

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

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