我需要一種方式來控制Android設備上的相機閃光燈,以便在錄製視頻時進行控制。我正在製作閃光燈應用程序,使用閃爍的閃光燈拍攝視頻會導致能夠記錄高速移動的物體,如風扇葉片。錄製視頻時啓用相機閃光燈
只能通過啓動視頻預覽並在相機參數中設置FLASH_MODE_TORCH來啓用閃光燈。這看起來像這樣:
Camera c = Camera.open();
Camera.Parameters p = c.getParameters();
p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
c.setParameters(p);
c.startPreview();
一旦預覽開始,我可以來回翻轉該參數打開和關閉指示燈。這很好,直到我嘗試錄製視頻。麻煩的是,爲了將相機提供給MediaRecorder,我首先必須解鎖它。
MediaRecorder m = new MediaRecorder();
c.unlock(); // the killer
m.setCamera(c);
之後,解鎖,我不能再改變相機參數,因此無法改變閃光燈狀態。
我不知道它實際上是有可能做到這一點,因爲我不是最好的,在Java的黑客,但這裏是我知道的:
- Camera.unlock()是土生土長的方法,所以我不能真正看到它鎖定我的方式背後的機制
- Camera.Parameter有一個包含其所有參數的HashMap
- Camera.setParameters(Parameters)接受HashMap,將其轉換爲字符串,並將其傳遞給本地方法
- 我可以消除所有參數,但從HashMap中的割炬模式和相機仍然會接受它
所以,我仍然可以訪問相機,但它不會聽我講的任何東西。 (這是一種Camera.unlock()的目的)
編輯:
檢查本機代碼後,我可以看到,在我的CameraService.cpp到Camera.setParameters電話(參數)被拒絕,因爲我的進程ID與攝像機服務記錄的進程ID不匹配。所以看起來這是我的障礙。
EDIT2:
這樣看來,所述MediaPlayerService是主服務,拍攝攝像機的控制當視頻正在記錄。我不知道這是否可行,但如果我可以在我自己的過程中以某種方式啓動該服務,我應該可以跳過Camera.unlock()調用。
EDIT3:
最後一個選擇是,如果我可以某種方式得到的指針CameraHardwareInterface。從外觀上看,這是一個設備特定的接口,可能不包含PID檢查。這個問題的主要問題是唯一可以找到它的指針位於CameraService中,並且CameraService不在說話。
Edit4:(幾個月後)
在這一點上,我不認爲這是可以做到什麼,我本來想。我不想刪除有人會回答的問題,但我不積極尋求答案。 (雖然接收到有效的答案會很棒。)
我真的不明白爲什麼你會認爲這是可能的。我希望視頻錄製可以完全控制攝像機。這需要特殊的編碼才能讓其他東西同時控制相機。 – 2012-10-16 01:08:40
我完全同意,在這一點上我不認爲這是可能的,但我現在只是在這個問題上離開這個問題,而不會有人奇蹟般地找到方法。 – thepenguin77 2012-11-03 01:27:07