好像這裏有兩個不相關的錯誤,一個在的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;
}
}
}
說明
這部分只是在這裏記錄兔子洞來找到這個參數,希望有人知道比我更多的可以擴大這一點。
症狀:
- 在三星S5,拍照與設置爲
FLASH_MODE_ON
或FLASH_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
Native對我的應用
的AEC(自動曝光)和AWB(白平衡)線是相同的,所以這是與我之前嘗試過的一致。唯一的區別是ZSL參數,我從來沒有聽說過。
谷歌搜索ZSL發現本SO answer:
爲了實現零快門滯後,照相機驅動程序必須保持含有全分辨率幀一個小圓形緩衝池。圖像以傳感器速率捕獲,併發送到預覽和循環緩衝池(作爲原始拜耳或作爲處理/半處理YUV)。當使用按下快門時,循環池中的最新緩衝區被提取,處理並壓縮成JPEG格式。在較舊的手機相機中,傳感器無法以足夠高的幀速捕捉全分辨率幀,因此ZSL無法實現。
因此,看起來快門時滯會導致閃光燈閃光時和拍攝照片時的時間不匹配。打開ZSL似乎完全消除了這個問題。它可能應該默認打開,因爲沒有它就會破壞閃光行爲,但我不會屏住呼吸。
這個問題似乎是題外話,因爲它無關的編程 – PeeHaa 2014-10-11 19:15:23
@PeeHaa這個問題有一切與編程。我正在尋求幫助,在我的應用程序中正確配置(編程)相機。 – 2014-10-11 19:19:27
我的Nexus 4出現類似問題。使用股票相機拍攝照片時,出現閃光燈,圖片顯示正常。用閃光燈拍攝我的自定義相機,整個圖像變得非常黑暗。 – 2014-11-07 22:51:32