谢谢, Gary
当使用连续对焦与闪光灯时,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;
}
}
}
与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;
}
}
}
这部分内容仅用于记录查找此参数的兔子洞,希望知道更多的人可以扩展此内容。
症状:
FLASH_MODE_ON
或FLASH_MODE_AUTO
拍摄照片会导致照片过暗或完全黑屏。我尝试的第一件事是调整与聚焦相关的设置,认为开阔的空间会导致聚焦需要更长时间,从而干扰了使用闪光灯拍照的时间。无论是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似乎完全消除了这个问题。考虑到没有它会导致闪光灯行为出现问题,它应该默认打开,但我不会指望这一点。
我在我的三星Galaxy S5上解决了这个问题。我打开相机,点击设置(左上角),然后关闭除闪光灯以外的所有选项。现在它会在闪光灯闪烁时拍照(而不是闪烁后)。照片清晰明亮。 如果需要更多信息,请查看自动设置,这些设置是在我关闭所有选项后自动出现的。 16M像素大小5312X2988 连拍关闭 低光检测关闭 人脸检测关闭 ISD AUTO ISO自动 测光模式中心重点 关闭轻触拍照 选择性对焦关闭 无效果 开启闪光灯 关闭定时器 关闭HDR(丰富色调) 测光模式中心重点