2011-12-27 9 views
2

私の目標は、できるだけ高いFPSを得ることです。私はBWの小さなフレームに満足していますが、FPSは最大になるはずです。 HTC WildFire Sの getSupportedPreviewFpsRangeは(9,30)を返します。しかし、私が最も簡単な処理でプレビュー画像を描画しようとすると、視覚的には最大で約12-15FPSになります。パラメータと、私はこれを行うstartPreview()メソッド呼び出し設定した後 :リアルタイムのコンピュータビジョン処理のために高いFPSを得る方法

camera.setPreviewCallback(new Camera.PreviewCallback() { 
      @Override 
      public void onPreviewFrame(byte[] bytes, Camera camera) { 
      Bitmap bitmap = Bitmap.createBitmap(size.width, size.height, Bitmap.Config.ARGB_8888); 
      int[] colors = new int[size.width * size.height]; 
      for (int i=0; i < colors.length; i++){ 
       colors[i] = getBWColor(bytes[i]); 
      } 
      bitmap.setPixels(colors, 0, size.width, 0, 0, size.width, size.height); 
      secondView.setImageBitmap(bitmap); 
      } 
     }); 
     } 

private static int getBWColor(byte b){ 
    int res = 255; 
    for(int i=0;i<3;i++){ 
     res = (res << 8) + b; 
    } 
    return res; 
    } 

は、できるだけ速くそれを取得する方法はありますか? =(

+0

誰かが「メディアレコーダーにソケットを供給すれば、ライブデータを書き込むことができます.が保存される前にデータをキャプチャすることができます(これは既に圧縮されています)。しかし、それをするために。 –

答えて

5

最初にsetPreviewCallbackWithBuffer()を使用すると、1つのバッファが再利用され、すべてのフレームに新しいバッファを割り当てる必要はありません。私のolder answerをチェックして、それを使用する例があります。

onPreviewFrame()で高価なオペレーションを実行しないと、データの時間が制限され、新しいフレームごとに書き換えられます。処理は別のスレッドで行う必要があります。

もちろん、各フレームに新しいビットマップを作成することは一度だけです。

+0

私は、ここで提案されたさまざまなスレッドや他のものを使用する例を見ました。私はすべての提案を蓄積し、私が何をしたかを書いています。ありがとうございました。 –

1

あなたの目標はこのアプリのためだけど、カメラ機能に追加した方法はカスタムsurfaceViewクラスを作成し、そこにカメラを設置しました。私はパラメータを設定してsetPreviewDisplayを呼び出し、作成したSurfaceHolder(下のコード)を渡してから、startpreview()を呼び出すだけですべてがきれいに機能しました。あなたは私より手の込んだまたはいくつかのコードを投稿したい私に知らせてください。

SufaceHolder mHolder; 
mHolder = getHolder(); 
mHolder.addCallback(this); // this is the SurfaceView class 
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
mHolder.setKeepScreenOn(true); 
3

私は本当にあなたがやっているのか理解していないが、私はあなたが処理中に自分を殺していると思いたい。

1)毎回新しいビットマップを作成しないでください。 1ビットマップを再利用する。 2)C/C++のビットマップをNDKで操作します。 「プラズマ」の例を見てください。 Javaよりもはるかに高速です。そのC++は本当にそうではありませんが、APIのJavaバージョンは、ピクセルのデータ配列をプッシュするたびにすべてのものを変換する傾向があるためです。 C++バージョンでは、ピクセル値を直接操作できます。