2016-07-30 96 views
1

如何知道隊列中當前的回調數量?Android攝像頭獲取隊列的回調緩衝區長度

有時計數會下降到1回調,我只能得到每秒2幀。

設置:

private void setupCallback(int bufferSize) 
{ 
    mCamera.setPreviewCallbackWithBuffer(this); 
    for (int i = 0; i <= NUM_BUFFERS; ++i) 
    { 
     byte[] cameraBuffer = new byte[bufferSize]; 
     mCamera.addCallbackBuffer(cameraBuffer); 
    } 
} 

@Override 
public void onPreviewFrame(byte[] data, Camera camera) 
{ 
    processFrame(data); 
    camera.addCallbackBuffer(data); 
} 

登錄表示:

d /相機-JNI:使用回調緩衝從長度的隊列4

但有時用相同的代碼,它說:

D/Ca mera-JNI:使用長度爲1的隊列中的回調緩衝區

我怎麼知道出現了問題並重置了這些緩衝區?

回答

0

在Android API中沒有辦法做到這一點。您可以將processFrame移動到另一個線程,以便onPreviewFrame基本上是非阻塞的。通過這種方式,大量的隊列將在您的流程中,並且您將能夠跟蹤它。

您還應該注意到onPreviewFrame在您調用Camera.open()的同一線程上被調用。如果該線程忙於做某事,onPreviewFrame將不會被調用,並且相應的緩衝區將退出緩衝池。出於這個原因,我建議你有專門的線程來處理Camera

+0

processFrame只需要15ms。我懷疑在這段時間內,預覽幀會拍攝3-4次。你能告訴我,如果以前仍在處理中,onPreviewFrame會發生什麼? –

+0

我添加了關於默認線程的註釋。你在調用'Camera.open()'什麼線程?主線程上的 – szym

+0

。我發現問題是什麼。但它沒有解決這個問題。 UI邏輯拋出了一個異常,在這個異常中除了1個onPreviewCallbacks被佔用。所以製作另一個線程並不能解決問題。如果通話間的時間太長,我決定重新設置回撥。 –