Google と StackOverflow を徹底的に検索してきましたが、これが見つかりません。多分私は明らかな何かを見逃しています。ありがとう!
(これは、プレビュー コールバックの Java 実装が [バッファを使用しても] 非効率的すぎるためです。)
Google と StackOverflow を徹底的に検索してきましたが、これが見つかりません。多分私は明らかな何かを見逃しています。ありがとう!
(これは、プレビュー コールバックの Java 実装が [バッファを使用しても] 非効率的すぎるためです。)
テーマについて少し調べてみました。このプレゼンテーション(p.277 から、中国語) は大いに役立ちました。
他の人が述べたように、メソッドを使用してバッファを取得できますCamera.setPreviewCallback。
これがそこでどのように起こるかです(冗長バージョン):
Camera.startPreview()ネイティブ関数であるユーザー呼び出し。android_hardware_Camera_startPreviewstartPreviewC++Cameraクラスのメソッドを呼び出します。CameraインターフェイスのstartPreviewメソッドを呼び出しますICameraICameraリモート クライアントをIPC呼び出します。setCameraModeメソッドを呼び出します。CameraServiceCameraServiceプレビューを表示するウィンドウを設定し、クラスのstartPreviewメソッドを呼び出します。CameraHardwareInterfacestart_previewメソッドを呼び出そうとします。私はそれ以上調べませんでしたが、ドライバーへの呼び出しを実行する必要があります。camera_device_tdataCallbackofCameraServiceが呼び出されます。handlePreviewDataクライアントのメソッドにデータを渡します。ICameraClient。ICameraClientに送信しIPCますCamera。Cameraは登録済みのリスナーを呼び出し、バッファを に渡しJNIます。Camera.addCallbackBuffer、最初にバッファにコピーします。Camera呼び出します。onPreviewFrameCamera.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 オブジェクトがあります。