Я занимаюсь разработкой приложения для Android, которое обрабатывает кадры предварительного просмотра Camera2 и отображает обработанные кадры на текстуре.Сначала я тестировал api camera1, он отлично работает для обработки изображений в реальном времени.
private class CameraPreviewCallback implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
processingRunnable.setNextFrame(data, camera);
}
}
Затем я изменил свой код, который использует камеру2 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 может напрямую предоставлять кадр NV21 от Camera1.