ビデオの録画中に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からTORCH-MODEを使用すると、カメラは引き続きそれを受け入れます。
だから、私はまだカメラにアクセスできますが、私が言ったことは何も聞きません。(これはCamera.unlock()の目的の一種です)
編集:
ネイティブコードを調べたところ、CameraService.cppで、カメラサービスが記録しているプロセスIDとプロセスIDが一致しないため、Camera.setParameters(Parameters)への呼び出しが拒否されていることがわかります。ですから、それが私のハードルのように見えます。
Edit2:
MediaPlayerServiceは、ビデオの録画時にカメラを制御する主要なサービスであるように見えます。可能かどうかはわかりませんが、どういうわけか自分のプロセスでそのサービスを開始できれば、Camera.unlock()呼び出しをスキップできるはずです。
Edit3:
最後のオプションは、CameraHardwareInterfaceへのポインターをなんとかして取得できるかどうかです。見た目からすると、これはデバイス固有のインターフェイスであり、おそらくPIDチェックは含まれていません。ただし、これに関する主な問題は、それへのポインターを見つけることができる唯一の場所がCameraServiceにあり、CameraServiceが通信していないことです。
Edit4 :(数か月後)
現時点では、本来やりたかったことはできないと思います。誰かが答えるという偶然の機会に質問を削除したくありませんが、私は積極的に答えを求めていません。(ただし、有効な回答を受け取るのは素晴らしいことです。)