我想了解传递给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线程解耦.
总结以上是内存溢出为你收集整理的java-了解并加快addCallbackBuffer全部内容,希望文章能够帮你解决java-了解并加快addCallbackBuffer所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)