编程语言
首页 > 编程语言> > java-了解并加快addCallbackBuffer

java-了解并加快addCallbackBuffer

作者:互联网

我想了解传递给addCallbackBuffer的预览缓冲区与通过onPreviewFrame传递的byte []数组之间的关系,该数组提示以下相关问题.

Q1.我猜想在addCallbackBuffer中传递的缓冲区用于存储新的相机帧,并且在调用onPreviewFrame之前,该缓冲区被复制到通过onPreviewFrame传递的数据缓冲区中.如果是这样,那意味着我可以在输入onPreviewFrame后立即调用addCallbackBuffer来重用预览帧缓冲区,并在处理完onPreviewFrame返回的缓冲区后在函数末尾进行注释.那是对的吗?

Q2.我也不清楚使用两个预览帧缓冲区的机制.假设我在初始化期间添加了两个私有byte []预览缓冲区,如下所示:

addCallbackBuffer(mPreviewBuffer1);
addCallbackBuffer(mPreviewBuffer2);

我在onPreviewFrame中时如何知道使用了哪个预览缓冲区,以便可以再次使用addCallbackBuffer重新添加正确的预览帧缓冲区?

private byte[] mPreviewBuffer1;
private byte[] mPreviewBuffer1;
...
public void onPreviewFrame(byte[] camera, Camera c) {
  ...
  // how do I decide which buffer to re-add?
  //c.addCallbackBuffer(mPreviewBuffer1);
  //c.addCallbackBuffer(mPreviewBuffer2);
  ...
}

Q3.我是否正确理解另一个线程负责获取帧缓冲区,即只要预览缓冲区在队列中,我们就会在执行onPreviewFrame时捕获帧?如果不是这种情况,拥有两个回调缓冲区将无助于提高速度,对吗?

解决方法:

Q1是的,如果您不关心缓冲区的内容,可以尽早将其返回相机.调用addCallbackBuffer()后,可能无法从该缓冲区读取数据,或者也许可以读取,但是像素数据将是错误的.

第二季度,您可以简单地将回叫中收到的缓冲区(即

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

在这种情况下,您不必关心data == mPreviewBuffer1还是data == mPreviewBuffer2.但是以下代码也可以:

private byte[][] mPrevieBuffers = new byte[4][];
@Override public void onPreviewFrame(byte[] data, Camera camera) {
  for (int i=0; i<mPreviewBuffers.length; i++) {
    if (data == mPreviewBuffers[i]) {
       processData(i);
    }
  }
}

第三季度正确,onPreviewFrame()与填充其他缓冲区并行执行,但是所有onPreviewFrame()回调均在同一线程上调用.如果要处理尽可能多的预览帧,则应a)将处理委派给工作线程(尤其是在多核设备上).请注意,您可以从其他线程安全地调用addCallbackBuffer(). b)start the camera on a separate Looper使onPreviewFrame()与UI线程解耦.

标签:android-camera,java,android
来源: https://codeday.me/bug/20191027/1947633.html