两个app共享摄像头的实现分析
有两种做法,一个是通过虚拟出一个共享摄像头的做法,本质上是硬件驱动层新增对某个物理摄像头的映射,需要修改驱动,增加cameraid,另外需要在摄像头的打开,streamOn和streamOff都要要做相应的修改,需要对camera的代码结构有很深的理解。这里为了简单,易行,我这里使用另一种做法,使用Binder去实现。
分析camera可以实现的方式:其中有surface是继承Parcelable的,可以通过binder方式去传递
binder的aidl的接口需要将surface传递到对应的app
如void addSurface(in Surface surface);
服务端程序需要将binder传递过来的surface加入到CameraCaptureSession中来,也就是重新预览,以下我们定义为mSurface
closeCaptureSession();
mPreviewBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 添加输出到屏幕的surface
// builder.addTarget(mPreviewSurface);
if(mSurface!=null) {
mPreviewBuilder.addTarget(mSurface);
}
mPreviewBuilder.addTarget(mImageReader.getSurface());
List<Surface> list = mSurface==null? Arrays.asList(mImageReader.getSurface()):Arrays.asList(mImageReader.getSurface(),mSurface);
mCameraDevice.createCaptureSession(list,
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession session) {
Log.i(TAG, "onConfigured: mCaptureSession0 ");
mCaptureSession = session;
CaptureRequest captureRequest = mPreviewBuilder.build();
try {
// 一直发送预览请求
mCaptureSession.setRepeatingRequest(captureRequest, null, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession session) {
Log.e(TAG, "ConfigureFailed. session: mCaptureSession");
}
}, mBackgroundHandler);