0

カメラからフレームを取得し、いくつかの画像処理技術を使用してそれらをフィルター処理し、カメラ プレビューの代わりにユーザーに表示する拡張現実アプリを構築しています。

私が最初に始めたとき、私は単に電話していました:

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 は引き続きサポートしたいと考えています。

4

1 に答える 1

0

私は公式の回答を受け取っていませんが、新しいAndroidバージョンではこれが非推奨になっているため、おそらくそうはなりませんが、SURFACE_TYPE_NORMALは多くのデバイスのカメラプレビューでの使用には無効であることがわかりました。

この答えは、さまざまなデバイスでのテストから得られます。一部のデバイスでは、ビデオが受信されません。使用されるさまざまなパラメータとは何の関係もありません。

于 2012-01-03T19:25:02.887 に答える