[英]Get frames from camera's phone in android
我想从相机的手机上获取相框。 所以,我尝试捕获视频,我使用matlab查找此视频的每秒帧数,我每10秒获得250帧。 但是当我使用时
public void onPreviewFrame(byte[] data, Camera camera) {}
在Android上,我每10秒只能获得70帧。 你知道为什么吗? 我把我的代码放在下面:
private Camera.PreviewCallback previewCallBack = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
System.out.println("Get frame " + frameNumber);
if (data == null)
throw new NullPointerException();
Camera.Parameters p = camera.getParameters();
Camera.Size size = p.getPreviewSize();
if (frameNumber == 0) {
startTime = System.currentTimeMillis();
}
// Log.e("GetData", "Get frame " + frameNumber);
frameNumber++;
camera.addCallbackBuffer(data);
}
}
确实如此; Android视频录制器不使用Camera.PreviewCallback ,它可能比使用Java回调获得的速度快得多。 原因是它可以将视频帧从相机发送到内核中的硬件编码器,而无需将像素放入用户空间。
但是,我已经在高级设备上可靠地实现了30 FPS,如Nexus 4或Galaxy S3。 秘诀是:通过使用Camera.setPreviewCallbackWithBuffer()避免垃圾收集,并使用HandlerThread从UI线程推送回调。
当然,预览回调本身应该尽可能彻底地进行优化。 在您的示例中,对camera.getParameters()
的调用很慢,可以避免。 不应该进行分配( new
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.