Android Camera2 getPreviewFrame
Android Camera2 getPreviewFrame
我正在尝试在预览模式下获取相机画面。我是 运行 来自 github https://github.com/googlesamples/android-Camera2Basic
的示例项目
我遇到的问题是在预览模式下获取框架。
代码如下:
private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
//HERE, HOW CAN I RETRIEVE THE CURRENT FRAME?
break;
}
case STATE_WAITING_LOCK: {
...
break;
}
case STATE_WAITING_PRECAPTURE: {
...
break;
}
case STATE_WAITING_NON_PRECAPTURE: {
...
break;
}
}
}
我试图获取框架的另一件事是设置 mImageReader.setOnImageAvailableListener。
我期望能够获得帧 onImageAvailable 回调,但从未调用过 onImageAvailable。 onPreviewFrame是我自己的方法,我需要把当前帧传给它。
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /*maxImages*/2);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mTextureView.onPreviewFrame(reader.acquireNextImage().getPlanes([0].getBuffer().array());
}
};
我做错了什么?
谢谢
当预览帧可用时,永远不会调用 OnImageAvailableListener.onImageAvailable
回调,因为发送到 CameraCaptureSession.setRepeatingRequest()
方法的 CaptureRequest
没有列出 ImageReader
的Surface
作为输出目标。
当您向相机发送请求时,您确定希望每次捕获的数据转到哪个输出 Surface
s(本质上是原始字节缓冲区)。因此,要让 "preview frames" 触发 onImageAvailable()
回调然后发送到您的 onPreviewFrame()
方法,只需添加以下行:
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
此行可以在 e.g. 之后,在将 SurfaceTexture
的 Surface
添加到同一请求构建器的其他类似行之后。
请注意,这会将每个预览帧发送到您的函数,以及来自捕获按钮的 "output frames"。您可能需要 onImageAvailable()
回调中的一些代码来区分。
我正在尝试在预览模式下获取相机画面。我是 运行 来自 github https://github.com/googlesamples/android-Camera2Basic
的示例项目我遇到的问题是在预览模式下获取框架。
代码如下:
private CameraCaptureSession.CaptureCallback mCaptureCallback = new CameraCaptureSession.CaptureCallback() {
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
//HERE, HOW CAN I RETRIEVE THE CURRENT FRAME?
break;
}
case STATE_WAITING_LOCK: {
...
break;
}
case STATE_WAITING_PRECAPTURE: {
...
break;
}
case STATE_WAITING_NON_PRECAPTURE: {
...
break;
}
}
}
我试图获取框架的另一件事是设置 mImageReader.setOnImageAvailableListener。 我期望能够获得帧 onImageAvailable 回调,但从未调用过 onImageAvailable。 onPreviewFrame是我自己的方法,我需要把当前帧传给它。
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), ImageFormat.JPEG, /*maxImages*/2);
mImageReader.setOnImageAvailableListener(mOnImageAvailableListener, mBackgroundHandler);
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
mTextureView.onPreviewFrame(reader.acquireNextImage().getPlanes([0].getBuffer().array());
}
};
我做错了什么? 谢谢
当预览帧可用时,永远不会调用 OnImageAvailableListener.onImageAvailable
回调,因为发送到 CameraCaptureSession.setRepeatingRequest()
方法的 CaptureRequest
没有列出 ImageReader
的Surface
作为输出目标。
当您向相机发送请求时,您确定希望每次捕获的数据转到哪个输出 Surface
s(本质上是原始字节缓冲区)。因此,要让 "preview frames" 触发 onImageAvailable()
回调然后发送到您的 onPreviewFrame()
方法,只需添加以下行:
mPreviewRequestBuilder.addTarget(mImageReader.getSurface());
此行可以在 e.g. 之后,在将 SurfaceTexture
的 Surface
添加到同一请求构建器的其他类似行之后。
请注意,这会将每个预览帧发送到您的函数,以及来自捕获按钮的 "output frames"。您可能需要 onImageAvailable()
回调中的一些代码来区分。