25

Google と StackOverflow を徹底的に検索してきましたが、これが見つかりません。多分私は明らかな何かを見逃しています。ありがとう!

(これは、プレビュー コールバックの Java 実装が [バッファを使用しても] 非効率的すぎるためです。)

4

3 に答える 3

25

テーマについて少し調べてみました。このプレゼンテーション(p.277 から、中国語) は大いに役立ちました。

カメラ プレビューの呼び出しチェーン

他の人が述べたように、メソッドを使用してバッファを取得できますCamera.setPreviewCallback
これがそこでどのように起こるかです(冗長バージョン):

  1. Camera.startPreview()ネイティブ関数であるユーザー呼び出し。
  2. android_hardware_Camera_startPreviewstartPreviewC++Cameraクラスのメソッドを呼び出します。
  3. CameraインターフェイスのstartPreviewメソッドを呼び出しますICamera
  4. ICameraリモート クライアントをIPC呼び出します。
  5. クラスのsetCameraModeメソッドを呼び出します。CameraService
  6. CameraServiceプレビューを表示するウィンドウを設定し、クラスのstartPreviewメソッドを呼び出します。CameraHardwareInterface
  7. 後者は、特定のデバイスでstart_previewメソッドを呼び出そうとします。私はそれ以上調べませんでしたが、ドライバーへの呼び出しを実行する必要があります。camera_device_t
  8. 画像が到着するとdataCallbackofCameraServiceが呼び出されます。
  9. handlePreviewDataクライアントのメソッドにデータを渡します。
  10. クライアントは、バッファをコピーするか、直接 に送信しますICameraClient
  11. ICameraClientに送信しIPCますCamera
  12. Cameraは登録済みのリスナーを呼び出し、バッファを に渡しJNIます。
  13. Java クラスでコールバックを呼び出します。ユーザーがバッファを指定した場合Camera.addCallbackBuffer、最初にバッファにコピーします。
  14. 最後に、Java クラスがメッセージを処理し、 のメソッドを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 は隠されています。使用方法については、この質問を参照してください。

于 2012-05-27T22:33:12.900 に答える
5

必要なことを行うためのパブリック API はありません。唯一の公式な (つまり、動作が保証されている) メソッドは、Camera.setPreviewCallback()の呼び出しによって設定される Java レベルのプレビュー コールバックです。Android > 3.0 では、Camera.setPreviewTexture()を使用してプレビュー データを GPU にルーティングし、そこで GLES を使用して処理する (または CPU に読み戻す) こともできます。GPU パスは、ICS AOSP カメラ アプリケーションがビデオ エフェクトに使用するものです。

おそらく、OpenCV などは Android フレームワークのネイティブ コードを調べて、Java Camera API をバイパスし、以下のサービスと直接やり取りしています。

これらのインターフェイスは公開 API の一部ではないため、Android のバージョン間でインターフェイスが変更されないという保証はまったくないため、これはかなり危険です。それらを使用しても今は問題ないかもしれませんが、ユーザーがデバイスをアップグレードすると、アプリは動作しなくなります。

于 2012-05-27T18:23:51.260 に答える
1

OpenCV for Androidをご覧になりましたか。彼らの高度なチュートリアルでは、JNI の使用方法が示され、カメラ パッケージには NativeProcessor オブジェクトがあります。

于 2012-05-22T19:48:45.777 に答える