我正在开发一个Android应用程序,该应用程序处理Camera2预览帧并在Texture上显示已处理的帧。首先,我使用camera1 api进行了测试,它可以很好地用于实时图像处理。
private class CameraPreviewCallback implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
processingRunnable.setNextFrame(data, camera);
}
}
然后,我更改了使用camera2 API的代码。为了获得预览帧,我将ImageFormat设置为YUV_420_888
mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 3);
mImageReaderPreview.setOnImageAvailableListener(mOnPreviewAvailableListener, mBackgroundHandler);
private final ImageReader.OnImageAvailableListener mOnPreviewAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image mImage = reader.acquireLatestImage();
if(mImage == null) {
return;
}
processingRunnable.setNextFrame(convertYUV420888ToNV21(mImage));
mImage.close();
}
};
但是,它的工作速度比camera1慢。可能是因为从YUV_420_888到NV21进行了一次额外的转换。由于Camera1可以直接从Camera1提供NV21帧。
答案 0 :(得分:1)
根据您的实现方式以及给定设备上YUV_420_888的布局,转换可能会很昂贵。
如果用纯Java编写,肯定会很慢。
也就是说,如果您使用的设备处于LEGACY硬件级别,则camera2必须在旧模式下运行,这对于接收YUV信息可能会很慢。对于这些设备,在您的用例中,最好使用API1。