Capturing Camera2 Preview Frames gibt leeren Puffer zurück
Ich habe an einer einfachen Android-App gearbeitet, mit der Streaming-Bilder von der Android-Camera2-API-Pipeline an meinen Algorithmus übergeben werden können. Ich habe bereits mehrere Anwendungen erstellt, die dies mithilfe der Android Camera1-API getreu durchführen. Trotz Überprüfung (Google Docs, Foren) auf korrekte Codierung kann ich in onImageAvailable () keine realen Daten aus dem ImageReader erfassen. Bitte beachten Sie den folgenden relevanten Code:
Einrichten der ImageReaders:
private void setUpCameraOutputs(int width, int height) {
[....code....]
mImageReader = ImageReader.newInstance(smallestJPEG.getWidth(),
smallestJPEG.getHeight(),
ImageFormat.JPEG, /*maxImages*/2);
// mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, null);
mPreviewImageReader = ImageReader.newInstance(smallest.getWidth(),
smallest.getHeight(),
ImageFormat.YUV_420_888, 2);
mPreviewImageReader.setOnImageAvailableListener(mOnPreviewImageAvailableListener,
mBackgroundHandler);
[....code....]
}
Einrichten der CaptureSession:
private void createCameraPreviewSession() {
try {
//Create Texture from Screen's TextureView
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
//Configure Default Buffer Size
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
//Create Output Surface from Texture
Surface surface = new Surface(texture);
// Set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder
= mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//Add Output Display surface
mPreviewRequestBuilder.addTarget(surface);
//Add Preview frame-grabbing surface
mPreviewRequestBuilder.addTarget(mPreviewImageReader.getSurface());
mCameraDevice.createCaptureSession(Arrays.asList(surface, mPreviewImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession cameraCaptureSession) {
// The camera is already closed
if (null == mCameraDevice) {
return;
}
// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;
try {
// Auto focus should be continuous for camera preview. [...code...]
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
// Flash is automatically enabled when necessary.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// Finally, we start displaying the camera preview.
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
[...code...]
}
}
@Override
public void onConfigureFailed(CameraCaptureSession cameraCaptureSession) {
[...code...]
}
}, null
);
} catch (CameraAccessException e) {
[...code...]
}
}
Einrichten des OnImageAvailableListener:
private ImageReader mPreviewImageReader;
private final ImageReader.OnImageAvailableListener mOnPreviewImageAvailableListener
= new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
//Acquire Image, ByteBuffer, then byte array
Image image = reader.acquireLatestImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
//Check bytes array for anydata
int cnt = 0;
for (int i = 0; i < bytes.length; i++){
if (bytes[i] != 0)cnt++;
}
Log.i(TAG, "cnt = " + cnt);
image.close();
//At this point, byte[] bytes is empty (all zero)
[...code...]
}
};
m Code-Snippet Nr. 3 gibt mein Byte-Puffer unabhängig vom ImageReader-Format immer leer (alle Nullen) zurück. Hat jemand dieses Problem gehabt? Fehlt mir ein Code?