三星Galaxy S5相机闪光灯问题

7
我正在开发一个带有自定义相机功能的应用程序。 在Galaxy S3,S4,HTC,Nexus上的相机都运行良好,但在S5上,所有需要闪光灯的照片都会变暗。 照片在预览中看起来很好,闪光灯也会发光,但是由传感器捕获的照片始终太暗,就好像闪光灯从未发出或者闪光灯发出和图像捕获发生在不同的时间。 闪光灯可以设置为自动或常亮模式,效果相同。 我已经尝试了FOCUS_MODE_CONTINUOUS_PICTURE和FOCUS_MODE_AUTO,但是结果相同。 请问还有什么其他建议吗?
谢谢, Gary

这个问题似乎与编程无关,因此不属于适当的主题。 - PeeHaa
3
@PeeHaa,这个问题与编程有关。我正在寻求帮助,以正确配置(编程)我的应用程序中的相机。 - Gary Kipnis
我在我的Nexus 4上遇到了类似的问题。使用原始相机拍照,会有闪光灯,照片效果良好。但是使用我的自定义相机带闪光灯拍摄时,整个图像变得非常暗。 - Patrick Dattilio
1
@PatrickDattilio 你最终解决了你的问题吗?我已经切换到使用原生相机,因为它肯定经过优化,可以完美地适配设备,但我最终失去了一些用户界面功能,但我想这样做是值得的,毕竟以牺牲一些功能来获得高质量的照片 :) - Gary Kipnis
很遗憾,我希望这篇文章能够引起一些关注。我尝试了连续对焦、将白平衡和场景设置为自动。但是都没有用。图像非常暗淡。我猜测这与另一篇Stackoverflow文章有关。 - Patrick Dattilio
2个回答

9
似乎这里有两个无关的bug,一个在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;
        }
    }
}

三星S5

与Nexus 4不同,三星S5似乎落后于闪光灯,导致照片偏暗。据我所知,在安全的方式下打开隐藏的零快门延迟参数(在稳健部分描述的方式),似乎不会对以下设备产生不良影响:Nexus 4,Nexus 5,Samsung S3,Samsung S4,三星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;
        }
    }
}

解释

这部分内容仅用于记录查找此参数的兔子洞,希望知道更多的人可以扩展此内容。

症状:

  • 在三星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

我的应用

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答案

为了实现零快门延迟,相机驱动程序必须维护一个包含全分辨率帧的小型循环缓冲池。图像以传感器速率捕获,并发送到预览和循环缓冲池(作为原始Bayer或经过处理/半处理的YUV)。当用户按下快门时,最新的缓冲区从循环池中提取出来,处理并压缩为JPEG格式。在旧的手机相机上,传感器无法以足够高的帧速率捕获全分辨率帧,因此无法实现ZSL。

因此,似乎快门延迟导致闪光灯触发时间与拍摄时间不匹配。打开ZSL似乎完全消除了这个问题。考虑到没有它会导致闪光灯行为出现问题,它应该默认打开,但我不会指望这一点。


我认为这就是我正在经历的事情。请看我的问题http://stackoverflow.com/questions/27277650/当我为sg5添加secret参数时,我的预览屏幕却出现了问题。(相机没有在onPictureTaken上暂停)你有遇到过这种情况吗?感谢你的建议! - BBaker
1
此外..当我使用FLASH_MODE_TORCH时,这也发生在我身上。它影响了我的自动对焦以及整体亮度(因为它无法自动对焦)在我的SG5上。在Nexus 5上没有这样的问题,但仍然存在实际图像保存与屏幕预览暂停之间的延迟。 - BBaker
1
非常感谢 & 不错的链接! - BBaker
1
没有黑屏问题。我的相机应用程序需要一直开启FLASH_MODE_TORCH,并且需要拍摄近距离的图像。在使用zsl参数之前,我无法让sg5对焦近距离...它会表现出正在对焦但是跳过清晰的图像并停留在模糊的位置。即使开启手电筒模式,我的图像也显得很暗,非常令人沮丧。所有这些问题都得到了解决,而我所面临的问题...(按钮点击和实际拍摄之间的延迟太长,我经常得到模糊的运动图片,因为用户已经移开了)再次感谢rraval! - BBaker
@ConstantinGeorgiu 请查看上面列出的链接获取我的代码。时间过去太久了,我不再拥有生产代码的副本。祝你好运。 - BBaker
显示剩余5条评论

0

我在我的三星Galaxy S5上解决了这个问题。我打开相机,点击设置(左上角),然后关闭除闪光灯以外的所有选项。现在它会在闪光灯闪烁时拍照(而不是闪烁后)。照片清晰明亮。 如果需要更多信息,请查看自动设置,这些设置是在我关闭所有选项后自动出现的。 16M像素大小5312X2988 连拍关闭 低光检测关闭 人脸检测关闭 ISD AUTO ISO自动 测光模式中心重点 关闭轻触拍照 选择性对焦关闭 无效果 开启闪光灯 关闭定时器 关闭HDR(丰富色调) 测光模式中心重点


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接