カメラからフレームを取得し、いくつかの画像処理技術を使用してそれらをフィルター処理し、カメラ プレビューの代わりにユーザーに表示する拡張現実アプリを構築しています。
私が最初に始めたとき、私は単に電話していました:
holder = getHolder();
holder.addCallback(this);
...
camera.addCallbackBuffer(buffer);
camera.setPreviewDisplay(holder);
camera.setPreviewCallbackWithBuffer(callback);
camera.startPreview();
コールバック内で次のことを行います。
SurfaceHolder holder;
Canvas c = holder.lockCanvas();
if (c != null) {
try {
// Draw to canvas
} finally {
holder.unlockCanvasAndPost(c);
}
}
これはかなりうまく機能し、Motorola Photon でまともなパフォーマンスを発揮していました。
Motorola Droid と LG Optimus も所有しています。これら 2 つのデバイスでは、 onPreviewFrameが呼び出されることはなく、その結果、所有者がコールバックで描画されることはありませんでした。そして、ユーザーは黒い画面で立ち往生します。
周りを検索した後、次の行を追加する必要があることがわかりました
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
この行で、最終的にコールバックを取得します。holder.lockCanvas()
しかし問題は、これは では許可されていないため、呼び出そうとするとエラーが発生することSURFACE_TYPE_PUSH_BUFFERS
です。
ImageView
を の上に配置し、代わりに にSurfaceView
フレームを描画することで、これを回避できるようになりました。ImageView
しかし、これのパフォーマンスは、 を使用する場合と比較してひどいものSURFACE_TYPE_NORMAL
です。
私の質問は次のとおりです。
SURFACE_TYPE_NORMAL
有効な使用可能なタイプですか、それとも信頼できるのはですかSURFACE_TYPE_PUSH_BUFFERS
?- もしそうなら、デバイスがサポートしているかどうかを判断して、サポートしているデバイス
SURFACE_TYPE_NORMAL
から余分なパフォーマンスを絞り出すことはできますか? 特定の Android バージョン、またはそれをサポートするメーカーはありますか?
補足として、Honeycomb (3.0) ではこれらの値がサポートされなくなったことを理解しています。ただし、2.3 以下では必須です。また、ICS (4.0) の場合、新しいSurfaceTexture
パイプラインは非常に高速です。しかし、少なくとも 2.2 と 2.3 は引き続きサポートしたいと考えています。