GoogleとStackOverflowを徹底的に検索してきましたが、見つかりません。多分私は明白な何かを逃しています。ありがとう!
(これは、Javaプレビューコールバックの実装[バッファがある場合でも]が非効率的すぎるためです。)
トピックについて少し調査しました。この プレゼンテーション (p.277、中国語から)は大いに役立ちました。
他の人が述べたように、_Camera.setPreviewCallback
_メソッドを使用してバッファを取得できます。
そこで発生する方法は次のとおりです(詳細バージョン):
Camera.startPreview()
を呼び出します。Android_hardware_Camera_startPreview
_は、C++ startPreview
クラスのCamera
メソッドを呼び出します。Camera
はstartPreview
インターフェースのICamera
メソッドを呼び出しますICamera
はリモートクライアントにIPC
呼び出しを行います。setCameraMode
クラスのCameraService
メソッドを呼び出します。CameraService
は、プレビューを表示するウィンドウを設定し、startPreview
クラスのCameraHardwareInterface
メソッドを呼び出します。start_preview
_デバイスで_camera_device_t
_メソッドを呼び出そうとします。dataCallback
のCameraService
が呼び出されます。handlePreviewData
メソッドにデータを渡します。ICameraClient
に直接送信します。ICameraClient
はそれをIPC
経由でCamera
に送信します。Camera
は登録済みのリスナーを呼び出し、バッファをJNI
に渡します。Camera.addCallbackBuffer
_でバッファーを提供した場合、最初にバッファーにコピーします。Camera
はメッセージを処理し、_Camera.PreviewCallback
_のonPreviewFrame
メソッドを呼び出します。ご覧のとおり、手順10、11で2つのIPC
呼び出しが呼び出され、バッファが少なくとも2回コピーされました。_camera_device_t
_によって返されるrawバッファの最初のインスタンスは別のプロセスでホストされており、アクセスできません。 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を使用してそこで処理する(または読み戻す)こともできます。 GPUパスは、ICS AOSPカメラアプリケーションがビデオエフェクトに使用するものです。
おそらく、OpenCVなどはAndroidフレームワークのネイティブコードを調べ、Java Camera APIをバイパスして、以下のサービスと直接通信しました。
これらのインターフェースはパブリックAPIの一部ではないため、Androidバージョン間で変更されないという保証はまったくないため、これはかなり危険です。それらを使用することは、時々問題ないかもしれません。ユーザーがデバイスをアップグレードすると、アプリは機能しなくなります。
OpenCV for Android をご覧になりましたか。彼らの 高度なチュートリアル はJNIの使用方法を示しており、カメラパッケージにはNativeProcessorオブジェクトが含まれています。