J'essaie de configurer la prévisualisation de la caméra via ImageReader (format YUV_420_888) en utilisant l'API Camera2. Tout d'abord, je dois choisir la taille d'aperçu prise en charge :
StreamConfigurationMap scmap = camCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size previewSizes[] = scmap.getOutputSizes(ImageReader.class);
Mon Nexus 5X supporte les tailles suivantes :
[4032x3024,4000x3000,3840x2160,3288x2480,3200x2400,2592x1944,2688x1512,2048x1536,1920x1080,1600x1200,1440x1080,1280x960,1280x768,1280x720,1024x768,800x600,864x480,800x480,720x480,640x480,640x360,352x288,320x240,176x144,160x120]
Préparez une instance d'ImageReader et démarrez CaptureSession avec une demande de capture répétitive :
mImageReader = ImageReader.newInstance(W,H, ImageFormat.YUV_420_888,1);
J'essaie ensuite de lire chaque image de prévisualisation (pour traitement ultérieur et affichage via GLES) dans le OnImageAvailableListener. Et ce que je veux savoir, c'est combien d'octets du canal Y j'ai reçu :
public void onImageAvailable(ImageReader reader) {
ByteBuffer yBuffer = mImageReader.acquireNextImage().getPlanes()[0].getBuffer();
Log.d("Camera2Debug","Y-channel bytes received: " + yBuffer.remaining());
...
}
Le canal Y d'une image YUV_420_888 doit contenir LxH octets, où W - est la largeur, et H - est la hauteur de l'image considérée.
Problème : Pour certaines tailles d'aperçu supportées, la taille réelle de yBuffer ne correspond pas à la valeur attendue. ( LxH ).
Par exemple :
Preview Size | Y-bytes received | Y-bytes expected | match
4032x3024 | 12 192 768 | 12 192 768 | yes
1920x1080 | 2 073 600 | 2 073 600 | yes
1440x1080 | 1 589 728 | 1 555 200 | no
1280x960 | 1 228 800 | 1 228 800 | yes
1280x768 | 983 040 | 983 040 | yes
800x600 | 499 168 | 480 000 | no
...
499168
En raison de ce problème, je ne peux pas utiliser la taille de prévisualisation nécessaire, même si elle est prise en charge par le périphérique.
Qu'est-ce que je fais de mal ?