私は、カメラからフレームを取り出し、いくつかの画像処理技術を使ってそれらをフィルタリングし、カメラプレビューの代わりにそれらをユーザに表示する拡張現実感アプリケーションを構築しています。SURFACE_TYPE_NORMALは有効なAndroidカメラタイプですか?
私が最初に私は単に呼んでいた開始しました:
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 DroidとLG Optimusを所有しています。これらの2つのデバイスでonPreviewFrameが呼び出されることはなく、その結果、ホルダーは決してコールバックで描画されません。そして、ユーザーは黒い画面で立ち往生します。
周りに検索した後、私は私が最終的にコールバックを取得する次の行は、この行では
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
を追加するために必要なことがわかりました。しかし、問題は、私がで許可されていないので、私はエラーが出るので、holder.lockCanvas()
に電話しようとした場合です。
ここではSurfaceView
の上にImageView
を置き、その代わりにフレームをImageView
に描画することで対処できました。しかし、これのパフォーマンスはSURFACE_TYPE_NORMAL
を使用する場合と比較してひどいです。
私の質問は以下のとおりです。
- は有効使用タイプ
SURFACE_TYPE_NORMAL
ですか、私はSURFACE_TYPE_PUSH_BUFFERS
を信頼できますか? - もしそうなら、デバイスが
SURFACE_TYPE_NORMAL
をサポートしているかどうかを判断することができるのですか?そのようなデバイスからパフォーマンスの余分なビットを奪うことができますか?特定のAndroidバージョン、またはそれをサポートするメーカーはありますか?
ハニーコム(3.0)では、これらの値はサポートされなくなりました。しかし、彼らは2.3以下の義務があります。また、ICS(4.0)では、新しいSurfaceTexture
パイプラインが急速に高速化しています。しかし、私はまだ少なくとも2.2と2.3をサポートしたいと思います。