2011-12-27 82 views
2

我的目標是獲得儘可能高的FPS。我會很滿意BW的小型框架,但FPS應該是最大的。 HTC WildFire S上的 getSupportedPreviewFpsRange返回(9,30)。但是當我嘗試使用最簡單的處理來繪製預覽圖像時,它的視覺效果最高可達12-15 FPS。 設置參數和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

有人建議「你可以給媒體記錄器提供插口,並且它會寫入實時數據 - 這樣你就可以在保存數據之前捕獲數據(但它已經被壓縮了)」但我並不真正瞭解去做吧。 – 2011-12-27 22:19:16

回答

5

首先,使用setPreviewCallbackWithBuffer(),它重新使用一個緩衝區,並且不必在每個幀上分配新的緩衝區。檢查我的older answer,有一個示例如何使用它。

比onPreviewFrame()中不要做任何昂貴的操作,數據的時間是有限的,它被重寫在每個新的幀上。你應該在另一個線程中進行處理。

當然,不要在每一幀上創建新的位圖顏色數組,只做一次。

+0

我看到了使用不同線程和人們在此處建議的其他內容的示例。我積累了所有的建議,而不是寫我做了什麼。謝謝你和其他評論員! – 2011-12-29 13:52:00

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)用NDK在C/C++中操作你的位圖。看看「等離子」的例子。它比Java快得多。不是因爲它的C++真的,而是因爲Java版本的API傾向於在每次爲像素推入數據數組時都轉換整個事物。在C++版本中,您可以直接操作像素值。