camera2 api 中使用 ImageReader
類間接獲取預覽幀數據。java
ImageReader 使用以前,須要設置一個監聽 OnImageAvailableListener
,在預覽幀可用時會被回調,在回調方法中能夠接收到預覽幀,並實現具體的處理邏輯。android
而後,獲取 ImageReader 的 Surface ,在建立相機捕獲會話時,添加進去做爲輸出Sruface。git
最後,構建捕獲請求時,須要將 ImageReader 的 Surface 添加進去。github
//獲取 ImageReader 和 surface
//前三個參數分別是須要的尺寸和格式,最後一個參數表明每次最多獲取幾幀數據,本例的2表明ImageReader中最多能夠獲取兩幀圖像流
previewReader = ImageReader.newInstance(previewSize.getWidth(), previewSize.getHeight(), ImageFormat.JPEG, 2);
previewReader.setOnImageAvailableListener(
new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
//獲取預覽幀數據
Image image = reader.acquireLatestImage();
//處理邏輯
if (image != null){
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
Log.d(TAG, "data-size=" + data.length);
buffer.get(data);
image.close();
}
}
},
null);
//獲取 ImageReader 的 Surface
final Surface readerSurface = previewReader.getSurface();
//預覽幀數據會同時輸出到 previewSurface,readerSurface
cameraDevice.createCaptureSession(Arrays.asList(previewSurface, readerSurface),
new CameraCaptureSession.StateCallback() {
……
});
//構建預覽捕獲請求時,添加 readerSurface
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.addTarget(readerSurface);
複製代碼
項目github地址api