Esiste un equivalente per Camera.PreviewCallback in Camera2 dell'API 21, meglio della mappatura su SurfaceTexture e l'estrazione di una Bitmap? Devo essere in grado di estrarre i dati di anteprima dalla fotocamera come YUV?Camera.PreviewCallback equivalente in Camera2 API
risposta
È possibile iniziare dal codice di esempio Camera2Basic da Google.
È necessario aggiungere la superficie del ImageReader
come un obiettivo alla richiesta di anteprima di cattura:
//set up a CaptureRequest.Builder with the output Surface
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
Dopo di che, è possibile recuperare l'immagine nel ImageReader.OnImageAvailableListener
:
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = null;
try {
image = reader.acquireLatestImage();
if (image != null) {
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
Bitmap bitmap = fromByteBuffer(buffer);
image.close();
}
} catch (Exception e) {
Log.w(LOG_TAG, e.getMessage());
}
}
};
Per ottenere un Bitmap
dal ByteBuffer
:
Bitmap fromByteBuffer(ByteBuffer buffer) {
byte[] bytes = new byte[buffer.capacity()];
buffer.get(bytes, 0, bytes.length);
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
}
Sì, utilizzare la classe ImageReader.
Creare un ImageReader utilizzando il formato ImageFormat.YUV_420_888 e le dimensioni desiderate (assicurarsi di selezionare una dimensione supportata dal dispositivo della fotocamera che si sta utilizzando).
Quindi utilizzare ImageReader.getSurface() per Surface per fornire a CameraDevice.createCaptureSession(), se presenti, eventuali altri output di anteprima.
Infine, nella richiesta di acquisizione ricorrente, aggiungi la superficie fornita da ImageReader come destinazione prima di impostarla come richiesta ripetuta nella sessione di cattura.
@ Eddy Tal vala, quando aggiungo il target come mPreviewRequestBuilder.addTarget (mImageReader.getSurface()); Congela le superfici. – user1154390
Quale errore si ottiene nel logcat? E hai aggiunto la superficie alla tua chiamata a createCaptureSession? –
Sì, impostare entrambe le superfici per l'output in createCaptureSession. Logcat non mostra alcun errore. Si blocca in avanti ma rimane bloccato negli ultimi due giorni. – user1154390
congela la vista Textur. (MPreviewRequestBuilder.addTarget (mImageReader.getSurface());) – user1154390