我们调用Camera2的api去使用相机的过程大概可以简述如下:
1、创建并确定一块SurfaceTexture用来预览数据
2、获取CameraManager服务并通过Characteristic去设置相机参数
3、使用CameraManager去openCamera并设置CameraDevice.StateCallback回调接口,这个回调接口会返回我们open的cameraDevice,获取到CameraDevice就获得了相机的控制权。
4、通过返回的cameraDevcie去创建session, mCameraDevice.createCaptureSession,这里可以传入两个参数,一个是我们的Surface作为消费者,比如预览拍照的Surface(Arrays.asList(mPreviewSurface, mImageReader.getSurface())),可以作为列表传入多个Surface,这里就已经开始创建Stream数据流了。另一个参数是 new CameraCaptureSession.StateCallback(),数据会话的回调,此回调监听配置是否完成以及数据流是否创建完成。并且返回CameraCaptureSession的实例。
5、收到数据配置完成的回调以后如果想要循环接收数据还要通过CameraCaptureSession来设置数据流, cameraCaptureSession.setRepeatingRequest(
mPreviewRequestBuilder.build(),
mPreCaptureCallback, mBackgroundHandler);
这里我们mPreviewRequestBuilder为CaptureRequest的实例,他包含了Surface的一些信息。这里的Surface需要跟createCaptureSession里传入的Surface列表对应。
当我们createCaptureSession的时候会传入Surface的list,当我们创建这些Surface的时候他们的format会被指定,如果没有指定那么将使用默认,当需要实现拍照,我们在创建ImageReader的时候可以直接指定Format,例如ImageReader.newInstance(largestRaw.getWidth(),
largestRaw.getHeight(), ImageFormat.RAW_SENSOR, /*maxImages*/ 5));
这里直接给一个RAW_SENSOR的格式,当然我们还可以指定JPEG等,这里的模式非常重要,因为下一步会影响到我们底层创建stream的时候数据流。
CameraDeviceImpl.java里configureStreamsChecked的时候会循环创建不同的数据流,最终会来到 Camera3Device::createStream创建每一路数据流,这里会根据Surface的format来创建不同数据流。
Surface的变形过程
Surface被配置到ArryList传送到createCaptureSession函数中,第一步在 outConfigurations.add(new OutputConfiguration(surface));中加入到outConfigurations中,OutputConfiguration用来管理图像的角度,colorspace,格式等信息,让后会把这个outConfigurations送入到native去创建数据流 mRemoteDevice.createStream(outputConfiguration)
然后在CameraDeviceClient.cpp中会将outConfigurations中的Surface取出并做变形onst std::vector
outputConfiguration.getGraphicBufferProducers();
直接取出IGraphicBufferProducer,然后创建自己的Surface
for (auto& bufferProducer : bufferProducers)
sp
res = createSurfaceFromGbp(streamInfo, isStreamInfoValid, surface, bufferProducer);
然后再去用Camera3Device.cpp创建Stream, err = mDevice->createStream(surfaces, deferredConsumer, streamInfo.width,
streamInfo.height, streamInfo.format, streamInfo.dataSpace,
static_cast
&streamId, physicalCameraId, &surfaceIds, outputConfiguration.getSurfaceSetID(),
isShared);
此时Surfaces转变了身份作为消费者存在了, Camera3Device::createStream(const std::vector
newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
width, height, blobBufferSize, format, dataSpace, rotation,
mTimestampOffset, physicalCameraId, streamSetId);
当我们CreateCaptureSession的时候还没有激活数据流,第一次会在我们下一步setRepeatRequest的时候去激活。
上一篇:NGINX配置SSL支持
下一篇:C#编程概述