我正在开发Android应用程序,我需要从相机中获取最大fps。
我一直在尝试实现setPreviewCallbackWithBuffer,但我无法让它工作。
有人能给我一个例子或解释吗?
我设置了一个计时器,每10毫秒运行一次,然后运行takePicture()。这是正确的,或者获取最大fps的方法是什么?
我已经到处搜索,但我找不到适合我的解释。
谢谢。
编辑2:
startRecording.setOnClickListener( new View.OnClickListener() {
public void onClick(View v) {
if(!recording)
{
recording = true;
thread.start();
cam.startPreview();
Size previewSize=cam.getParameters().getPreviewSize();
int dataBufferSize=(int)(previewSize.height*previewSize.width*(ImageFormat.getBitsPerPixel(cam.getParameters().getPreviewFormat())/8.0));
cam.addCallbackBuffer(new byte[dataBufferSize]);
cam.addCallbackBuffer(new byte[dataBufferSize]);
cam.addCallbackBuffer(new byte[dataBufferSize]);
cam.setPreviewCallbackWithBuffer(new PreviewCallback() {
public void onPreviewFrame(byte[] imageData, Camera arg1) {
try {
photos.add(imageData);
} catch(Exception e) { System.out.println("ERROR!");
}
}
});
}
(...)
谢谢!
答案 0 :(得分:1)
引用the documentation for setPreviewCallbackWithBuffer()
:
使用addCallbackBuffer(byte [])提供的缓冲区,除了在屏幕上显示之外,还为每个预览帧安装一个回调函数。只要预览处于活动状态且缓冲区可用,就会重复调用回调。任何其他预览回调都会被覆盖。
因此,请删除Timer
。只需拨打setPreviewCallbackWithBuffer()
一次,您就可以使用预览框进行调用,因为它们已准备好进行处理。
引用the documentation for addCallbackBuffer()
:
对于YV12以外的格式,缓冲区的大小通过将预览图像宽度,高度和每像素字节数相乘来确定。可以从getPreviewSize()读取宽度和高度。可以使用getPreviewFormat()中的图像格式从getBitsPerPixel(int)/ 8计算每像素的字节数。
如果使用YV12格式,可以使用setPreviewFormat(int)中列出的公式计算大小。
请遵循这些说明,而不是猜测缓冲区大小。
进一步引用the documentation for addCallbackBuffer()
:
将预先分配的缓冲区添加到预览回调缓冲区队列。应用程序可以向队列添加一个或多个缓冲区。当预览帧到达并且仍然存在至少一个可用缓冲区时,将使用缓冲区并从队列中删除缓冲区。然后使用缓冲区调用预览回调。如果帧到达并且没有剩余缓冲区,则丢弃该帧。应用程序应在完成处理数据时添加缓冲区。
当您致电addCallbackBuffer()
时,请预先致电setPreviewCallbackWithBuffer()
获取一些缓冲区。在onPreviewFrame()
中,安排后台线程来处理该帧的缓冲区。完成该工作后,通过调用addCallbackBuffer()
将相同的缓冲区添加回池中。 NOT 只是继续分配新的缓冲区。