Объединение нескольких ответов в более удобоваримый, потому что ответ @ VP, хотя технически ясный, трудно понять, если вы впервые переходите с Camera на Camera2:
Используя https://github.com/googlesamples/android-Camera2Basic в качестве отправной точки, измените следующий:
В createCameraPreviewSession()
инициализируйте новый Surface
из mImageReader
Surface mImageSurface = mImageReader.getSurface();
Добавьте эту новую поверхность в качестве выходной цели вашей переменной CaptureRequest.Builder
. Используя пример Camera2Basic, переменная будет mPreviewRequestBuilder
mPreviewRequestBuilder.addTarget(mImageSurface);
Вот фрагмент с новыми строками (см. Мои комментарии @AngeloS):
private void createCameraPreviewSession() {
try {
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;
// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
// This is the output Surface we need to start preview.
Surface surface = new Surface(texture);
//@AngeloS - Our new output surface for preview frame data
Surface mImageSurface = mImageReader.getSurface();
// We set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
//@AngeloS - Add the new target to our CaptureRequest.Builder
mPreviewRequestBuilder.addTarget(mImageSurface);
mPreviewRequestBuilder.addTarget(surface);
...
Затем в setUpCameraOutputs()
измените формат с ImageFormat.JPEG
на ImageFormat.YUV_420_888
, когда вы инициализируете свой ImageReader
. (PS, я также рекомендую уменьшить размер предварительного просмотра для более плавной работы - одна приятная особенность Camera2)
mImageReader = ImageReader.newInstance(largest.getWidth() / 16, largest.getHeight() / 16, ImageFormat.YUV_420_888, 2);
Наконец, в вашем onImageAvailable()
методе ImageReader.OnImageAvailableListener
обязательно используйте предложение @ Kamala, потому что предварительный просмотр остановится через несколько кадров, если вы его не закроете.
@Override
public void onImageAvailable(ImageReader reader) {
Log.d(TAG, "I'm an image frame!");
Image image = reader.acquireNextImage();
...
if (image != null)
image.close();
}
person
AngeloS
schedule
22.04.2017
setOnImageAvailableListener
для получения нового изображения при захвате. Чтобы нарисовать изображение, я создал поверхность OpenGL, которая отображает текстуру и шейдер, конвертирующийYUV_420_888
вRGB
. - person bubo   schedule 20.12.2015onImageAvailable(...)
вы действительно читаете и закрываете изображение. Слушатель не может быть пустым, даже если вы не используете изображение, необходимое для его чтения (например, сreader.acquireNextImage()
). - person bubo   schedule 25.12.2015