Google と StackOverflow を徹底的に検索してきましたが、これが見つかりません。多分私は明らかな何かを見逃しています。ありがとう!
(これは、プレビュー コールバックの Java 実装が [バッファを使用しても] 非効率的すぎるためです。)
Google と StackOverflow を徹底的に検索してきましたが、これが見つかりません。多分私は明らかな何かを見逃しています。ありがとう!
(これは、プレビュー コールバックの Java 実装が [バッファを使用しても] 非効率的すぎるためです。)
テーマについて少し調べてみました。このプレゼンテーション(p.277 から、中国語) は大いに役立ちました。
他の人が述べたように、メソッドを使用してバッファを取得できますCamera.setPreviewCallback
。
これがそこでどのように起こるかです(冗長バージョン):
Camera.startPreview()
ネイティブ関数であるユーザー呼び出し。android_hardware_Camera_startPreview
startPreview
C++Camera
クラスのメソッドを呼び出します。Camera
インターフェイスのstartPreview
メソッドを呼び出しますICamera
ICamera
リモート クライアントをIPC
呼び出します。setCameraMode
メソッドを呼び出します。CameraService
CameraService
プレビューを表示するウィンドウを設定し、クラスのstartPreview
メソッドを呼び出します。CameraHardwareInterface
start_preview
メソッドを呼び出そうとします。私はそれ以上調べませんでしたが、ドライバーへの呼び出しを実行する必要があります。camera_device_t
dataCallback
ofCameraService
が呼び出されます。handlePreviewData
クライアントのメソッドにデータを渡します。ICameraClient
。ICameraClient
に送信しIPC
ますCamera
。Camera
は登録済みのリスナーを呼び出し、バッファを に渡しJNI
ます。Camera.addCallbackBuffer
、最初にバッファにコピーします。Camera
呼び出します。onPreviewFrame
Camera.PreviewCallback
ご覧のとおりIPC
、ステップ 10、11 で 2 つの呼び出しが呼び出され、バッファが少なくとも 2 回コピーされcamera_device_t
ましたCameraService
。
Camera.setPreviewTexture
ただし、またはいずれかを使用してプレビュー サーフェスを設定するCamera.setPreviewDisplay
と、カメラ デバイスに直接渡され、上記のすべてのチェーンに参加することなくリアルタイムで更新されます。ドキュメントにあるように:
画面コンポジターによって管理されている raw バッファーへのハンドル。
Java クラスSurface
には、その内容を取得するメソッドがあります。
public static native Bitmap screenshot(int width, int height, int minLayer, int maxLayer);
しかし、この API は隠されています。使用方法については、この質問を参照してください。
必要なことを行うためのパブリック API はありません。唯一の公式な (つまり、動作が保証されている) メソッドは、Camera.setPreviewCallback()の呼び出しによって設定される Java レベルのプレビュー コールバックです。Android > 3.0 では、Camera.setPreviewTexture()を使用してプレビュー データを GPU にルーティングし、そこで GLES を使用して処理する (または CPU に読み戻す) こともできます。GPU パスは、ICS AOSP カメラ アプリケーションがビデオ エフェクトに使用するものです。
おそらく、OpenCV などは Android フレームワークのネイティブ コードを調べて、Java Camera API をバイパスし、以下のサービスと直接やり取りしています。
これらのインターフェイスは公開 API の一部ではないため、Android のバージョン間でインターフェイスが変更されないという保証はまったくないため、これはかなり危険です。それらを使用しても今は問題ないかもしれませんが、ユーザーがデバイスをアップグレードすると、アプリは動作しなくなります。
OpenCV for Androidをご覧になりましたか。彼らの高度なチュートリアルでは、JNI の使用方法が示され、カメラ パッケージには NativeProcessor オブジェクトがあります。