2014-05-15 104 views
2

我想從相機的手機獲取框架。因此,我嘗試捕捉視頻,並使用matlab查找此視頻的每秒幀數,我每10秒鐘獲得250幀。但當我使用從相機的手機獲取框架在android

public void onPreviewFrame(byte[] data, Camera camera) {} 

在Android上,我只得到70幀/ 10秒。 你知道爲什麼嗎?我把我的代碼如下:

private Camera.PreviewCallback previewCallBack = new Camera.PreviewCallback() { 
    @Override 
    public void onPreviewFrame(byte[] data, Camera camera) { 

     System.out.println("Get frame " + frameNumber); 
     if (data == null) 
      throw new NullPointerException(); 
     Camera.Parameters p = camera.getParameters(); 
     Camera.Size size = p.getPreviewSize(); 
     if (frameNumber == 0) { 
      startTime = System.currentTimeMillis(); 
     } 
     // Log.e("GetData", "Get frame " + frameNumber); 
     frameNumber++; 

     camera.addCallbackBuffer(data); 

      } 
     } 

回答

5

這是真的; Android錄像機不使用Camera.PreviewCallback,它可能比使用Java回調獲得的速度快得多。原因是它可以將攝像機的視頻幀發送到內核中的硬件編碼器,而無需將像素放入用戶空間。

但是,我已經在Java等先進設備上可靠地實現了30 FPS,如Nexus 4或Galaxy S3。祕密是:通過使用Camera.setPreviewCallbackWithBuffer()來避免垃圾回收,並通過使用eventLoop將回調從UI線程中推出。

當然,預覽回調本身應儘可能地進行優化。在您的示例中,撥打camera.getParameters()的速度很慢,可以避免。不應該分配(new)。

+1

謝謝你,Alex Cohn。 – user3629083