2016-07-30 51 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被占用。所以制作另一个线程并不能解决问题。如果通话间的时间太长,我决定重新设置回拨。 –