客户端接入指南更新时间: 2024-12-26 10:02:00

一、接入方式

1、把aar包放到项目的libs目录中,然后在project的build.gradle中配置如下:

dependencies {    
implementation fileTree(include: [*.aar'], dir: 'libs')
}

2、导入的是jar包的话,还需要在AndroidManifest.xml中配置如下:

< uses-library android: name = "camerax-vendor-extensions.jar"  android: required = "false" / > 
< queries >
< package android: name = "com.android.camera" / > < /queries>
< /queries>

3、另外,MiCameraSDK提供maven依赖方式(url、username和password信息需和客服领取):

allprojects {
repositories {
google()
jcenter()
maven {
url "*************************"
credentials {
username="**********"
password=" ******************************"
}
}
}
}

dependencies {    
implementation 'com.xiaomi.camera.sdk:mi-camera-sdk:0.0.2'
}  

二、时序图

上传文件

三、调用方法说明

//      -------------------初始化     
MiCamera mMiCamera = new MiCamera();
// -------------------步骤一
mMiCamera.getCameraIdByType(); // 选择要打开的摄像头
mMiCamera.openCamera();
// -----------------步骤二
mMiCamera.get[Preview | Capture | Video | ContiuousYUV] Size(getCurrentMode(),
mCameraId) // 选择尺寸
mMiCamera.createCaptureSession(); // 创建CaptureSession
// --------------------步骤三
mMiCamera.getSupportedAlgoList(algo); // 获取支持的算法列表
mMiCamera.isAlgoSupported(algo); // 如果只用到某种算法,可以只判断某种算法是否支持
mMiCamera.isAlgoConflict(algoOne, algoTwo); // 支持的列表算法里面,有些算法是互斥的,比如bokeh与mfnr互斥
// --------------------步骤四
mMiCamera.applyCommonParam(CaptureRequest.Builder); // 设置基础参数,否则会导致后面算法不生效
mMiCamera.applyBeauty(); // 设置美颜
mMiCamera.applyFrontBokeh(); // 设置前置人像
mMiCamera.applyVideoStabilization(); // 设置防抖
mMiCamera.applyHDR(); // 设置HDR
mMiCamera.applyMFNR(); // 设置多帧降噪
mMiCamera.applyNightMode(); // 设置超级夜景

1、初始化

调用这个方法时会在构造方法里面初始化支持的算法列表。

示例代码:

MiCamera mMiCamera = new MiCamera(Context context);

2、getCameraIdByType

请尤其注意此步骤,在openCamera之前调用此方法,以获取要打开的摄像头ID。

SDK Function: 

public String getCameraIdByType(@CameraLensType int cameraLensType) 

3、openCamera

与camera api2的流程一样,这一步打开相机。

SDK Function: 

public void openCamera(@NonNull String cameraId,  
@NonNull final CameraDevice.StateCallback callback, @Nullable Handler handler) 

4、getSize

为了更好的画质,我们仅提供经过测试及调教的preview,capture,video,continuousYUV(一般用于扫码,人脸识别)size。不建议用其他size,有可能会导致画质,稳定性的问题。

public List<Size> getPreviewSize(int mode, String cameraID) {  
    return this.mDefaultSizeContainer.getPreviewSize(mode, cameraID);  
}  
  
public List<Size> getVideoSize(int mode, String cameraID) {  
    return this.mDefaultSizeContainer.getVideoSize(mode, cameraID);  
}  
  
public List<Size> getCaptureSize(int mode, String cameraID) {  
    return this.mDefaultSizeContainer.getCaptureSize(mode, cameraID);  
}  
  
public List<Size> getContinuousYUVSize(int mode, String cameraID) {  
    return this.mDefaultSizeContainer.getContinueYuvSize(mode, cameraID);  
}  

5、createCaptureSession

这个过程比camera2 API多一个参数Mode。

Mode按照场景给算法分类,createCaptureSession的时候,底层会按照Mode去加载算法,一些场景用不到的算法就先不加载,以达到节省内存功耗的目的。

SDK Function:

@RequiresApi(api = Build.VERSION_CODES.P)  
public void createCaptureSession(@Mode int mode, CameraDevice cameraDevice,int templateType, int sessionType,    @NonNull List<Surface> outputs,   @Nullable Handler handler, CameraCaptureSession.StateCallback cb)

另外还提供了参数为SessionConfiguration的方法。

public void createCaptureSession(@Mode int mode, @NonNull CameraDevice cameraDevice, int templateType, SessionConfiguration config)

6、算法列表

获取支持的算法列表,判断算法是否支持,是否互斥。再决定是否调用该算法,做一些三方业务逻辑。

6.1、判断算法是否可用

SDK Function:

/** 
* @return true if the algorithm is supported with cameraID in the mode 
*/  
public boolean isAlgoSupported(@Mode int mode, String cameraID, @Algo int algo)  

示例代码:

if  (mMiCamera.isAlgoSupported(MiCamera.Algo.BEAUTY))  {         
mMiCamera.applyBeauty(builder,  mBeautyLevelValue,  mBeautySkinSmoothValue, mBeautyFaceThinValue);
}  

6.2、获取支持的算法列表

获取当前模式下的算法列表。当应用上存在多个配置选项时,需要根据相机支持的算法列表来显示配置项。

SDK Function:

/**   
* @return the supported algorithm list with cameraID in the mode
*/
public  List < Integer >  getSupportedALGOList(@Mode  int  mode,  String  cameraID)

示例代码:

private void refreshConfigView() {  
    mTvBokeh.setVisibility(View.INVISIBLE);  
    mTvMfnr.setVisibility(View.INVISIBLE);  
    mBeautyIcon.setVisibility(View.INVISIBLE);  
    mBtnHdr.setVisibility(View.INVISIBLE);  
    List<Integer> algoList =  mMiCamera.getSupportedAlgoList();  
    for (Integer integer : algoList) {  
        switch (integer){  
            case MiCamera.Algo.BEAUTY:  
                mBeautyIcon.setVisibility(View.VISIBLE);  
                break;  
            case MiCamera.Algo.MFNR:  
                mTvMfnr.setVisibility(View.VISIBLE);  
                break;  
            case MiCamera.Algo.BOKEH_FRONT:  
                mTvBokeh.setVisibility(View.VISIBLE);  
                break;  
            case MiCamera.Algo.HDR:  
                mBtnHdr.setVisibility(View.VISIBLE);  
                break;  
        }  
    }  
}  

6.3、算法互斥

例如HDR与MFNR互斥,他们就不能同时启用,以下代码就是查询first与second算法有没有存在冲突。如果存在冲突,则disable与目标算法冲突的算法。

SDK Function:

/** 
 * @param mode see {@link Mode} 
 * @param first see {@link Algo} 
 * @param second see {@link Algo} 
 * @return true if  the first is conflict with second or not in the mode </p> 
 */  
public boolean isAlgoConflict(@Mode int mode, @Algo int first, @Algo int second)  

7、设置CaptureRequest参数

下发预览,拍照参数。拍照,预览都需要调用对应的方法。有些算法只在拍照中生效,有些则拍照/预览都生效。

7.1、设置Preview基础参数

下发preview request之前,request必须通过sdk设置基础参数,否则后面的算法不会生效:

public void applyCommonParam(CaptureRequest.Builder builder) 

7.2、Beauty

生效场景: 预览/拍照/视频

Mode: Mode.CAPTURE/Mode.VIDEO_NORMAL

SDK Function:

/** 
* set the beauty parameter 
* @param builder  CaptureRequest.Builder 
* @param beautyConfig
*/  
public void applyBeauty(CaptureRequest.Builder builder, BeautyConfig beautyConfig)   

此算法必须配置以下2路流:

①预览

Surface previewSurface1 = new Surface(texture1);
mPreviewBuilder.addTarget(previewSurface1);
surfaceList.add(previewSurface1);

②拍照

mImageReaderJpeg = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.JPEG, 2);
mImageReaderJpeg.setOnImageAvailableListener(reader  - >  {
},  mBackgroundHandler);
surfaceList.add(mImageReaderJpeg.getSurface());

mImageReaderYuv = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.YUV_420_888, 2);
surfaceList.add(mImageReaderYuv.getSurface());

7.3、HDR

使能HDR时,会使ZSL(零延时拍照)失效。

生效场景: 拍照

Mode: Mode.CAPTURE

SDK Function:

/** 
* call this method will also disable ZSL, because enable ZSL will disable HDR algorithm 

* @param builder capture request builder 
* @param enable true means enable HDR 
*/  
public void applyHDR(CaptureRequest.Builder builder, boolean enable)  

可通过预览的TotalCaptureRequest检测当前场景是否需要开启HDR算法,算法如下:

/** 
 * @param result The total output metadata from the capture, including the
* final capture parameters and the state of the camera system during capture.
 *  @return true if detected hdr scene
 */
public static boolean isHDRDetected(CaptureResult result)  

在一些环境是不需要启动HDR的,不会启用HDR算法,拍照结果可以通过以下方法判断是否已启用HDR算法:

/**
 * @param result The total output metadata from the capture, including the
* final capture parameters and the state of the camera system during capture.
 *  @return true if the capture contain HDR algorithm
 */  
public static boolean isHDREffected(CaptureResult result)  

此算法必须配置2路流,请参考7.2。

7.4、前置人像

生效场景: 预览/拍照

Mode: Mode.CAPTURE/ Mode.BOKEH

SDK Function:

/** 
 * enable bokeh of not 
 * @param builder capture request builder 
 * @param enable true means enable bokeh 
 */  
public void applyBokehFront(CaptureRequest.Builder builder, boolean enable)   

此算法必须配置2路流,请参考7.2。

7.5、人像模式

生效场景: 预览/拍照

Mode: Mode.BOKEH

获取F Number的取值范围:

/**
* @return F number
*/
public List<String> getFNubmer() 

设置F Number:

/**
* set the F number of bokeh
 *
 * @param builder
 * @param fnumber see {@link MiCamera#getFNubmer}}
 * @apply_scene preview/capture
 */
public void applyBokehFNumber(CaptureRequest.Builder builder, String fnumber) 

Bokeh算法需要实时获取设备方向,所以设备方向改变的时候需要设置方向:

/**
 * update device orientation when changed
 *
 * @param builder
 * @param orientation value range: [0, 90, 180, 270]
 */
public void applyDeviceOrientation(CaptureRequest.Builder builder, int orientation)

此算法必须配置2路流,请参考7.2。

7.6、人像模式2X

生效场景: 预览/拍照

Mode: Mode. BOKEH_2X

获取F Number的取值范围:

/**
* @return F number
*/
public List<String> getFNubmer() 

设置F Number:

/**
* set the F number of bokeh
*
* @param builder
* @param fnumber see {@link MiCamera#getFNubmer}}
* @apply_scene preview/capture
*/
public void applyBokehFNumber(CaptureRequest.Builder builder, String fnumber) 

Bokeh算法需要实时获取设备方向,所以设备方向改变的时候需要设置方向:

/**
 * update device orientation when changed
 *
 * @param builder
 * @param orientation value range: [0, 90, 180, 270]
 */
public void applyDeviceOrientation(CaptureRequest.Builder builder, int orientation)

此算法必须配置2路流,请参考7.2。

7.7、夜景

启用夜景需要在createCaptureSession的时候,传入对应的Mode.SUPER_NIGHT。使能夜景拍照时,会使ZSL(零延时拍照)失效。

这个模式下不需要开闪光灯,否则对画质产生不好的影响。

生效场景: 拍照

Mode: Mode.SUPER_NIGHT

SDK Function:

/** 
* call this method will also disable ZSL, because enable ZSL will disable night‘s algorithm effect 
* @param builder CaptureRequest.Builder 
* @param enable true means enable night mode 
*/  
public void applyNightMode(CaptureRequest.Builder builder, boolean enable) 

此算法必须配置2路流,请参考7.2。

7.8、多帧降噪

生效场景: 拍照

Mode: Mode.CAPTURE

SDK Function:

/**
* call this method will enable ZSL to prevent hang when capture 

* @param builder capture request builder 
* @param enable true means enable MFNR 
*/  
public void applyMFNR(CaptureRequest.Builder builder, boolean enable)  

此算法必须配置2路流,请参考7.2。

7.9、普通视频

该模式可以设置bokeh,美颜。

生效场景: 录像

Mode: Mode.VIDEO_NORMAL

设置美颜请参照美颜“4.6.2 Beauty”

设置bokeh参数请参照下面:

/**
* applyVideoBokeh
* @param builder
* @param value  range : 0-100
*/
public void applyVideoBokeh(CaptureRequest.Builder builder, float value)

此模式必须配置以下3路流:

③预览

Surface previewSurface1 = new Surface(texture1);
mPreviewBuilder.addTarget(previewSurface1);
surfaceList.add(previewSurface1);

④拍照

mImageReaderJpeg = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.JPEG, 2);
mImageReaderJpeg.setOnImageAvailableListener(reader -> {
}, mBackgroundHandler);
surfaceList.add(mImageReaderJpeg.getSurface());

⑤录像

Surface recorderSurface = mMediaRecorder.getSurface();
mPreviewBuilder.addTarget(recorderSurface);
surfaceList.add(recorderSurface);

mImageReaderYuv = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.YUV_420_888, 2);
surfaceList.add(mImageReaderYuv.getSurface());

等录像流。

7.10、视频防抖

生效场景: 录像

Mode: Mode.VIDEO_STABILIZATION

SDK Function:

/** 
 * enable/disable video stabilization
 * @param builder capture request builder 
 * @param enable true means enable antiShake 
 */  
public void applyVideoStabilization (CaptureRequest.Builder builder, boolean on)  

7.11、视频防抖Pro

生效场景: 录像

Mode: Mode.VIDEO_STABILIZATION_V3
SDK Function:

/** 
 * enable video stabilizationV3
 * @param builder capture request builder 
 * @param status 0: Preview
* 1: startRecording
* 2: stopRecording 
 */  
public void applyVideoStabilizationV3 (CaptureRequest.Builder builder, int status)  

7.12、视频HDR

生效场景: 录像

Mode: Mode.VIDEO_HDR

无需设置其他参数

此模式必须配置以下3路流:

①预览

Surface previewSurface1 = new Surface(texture1);
mPreviewBuilder.addTarget(previewSurface1);
surfaceList.add(previewSurface1);

②拍照

mImageReaderJpeg = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.JPEG, 2);
mImageReaderJpeg.setOnImageAvailableListener(reader -> {
}, mBackgroundHandler);
surfaceList.add(mImageReaderJpeg.getSurface());

③录像

Surface recorderSurface = mMediaRecorder.getSurface();
mPreviewBuilder.addTarget(recorderSurface);
surfaceList.add(recorderSurface);

mImageReaderYuv = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.YUV_420_888, 2);
surfaceList.add(mImageReaderYuv.getSurface());

等录像流。

7.13、视频HDR10

生效场景: 录像

Mode: Mode. VIDEO_HDR10

无需设置其他参数

此模式必须配置以下3路流:

④预览

Surface previewSurface1 = new Surface(texture1);
mPreviewBuilder.addTarget(previewSurface1);
surfaceList.add(previewSurface1);

⑤拍照

mImageReaderJpeg = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.JPEG, 2);
mImageReaderJpeg.setOnImageAvailableListener(reader -> {
}, mBackgroundHandler);
surfaceList.add(mImageReaderJpeg.getSurface());

⑥录像

Surface recorderSurface = mMediaRecorder.getSurface();
mPreviewBuilder.addTarget(recorderSurface);
surfaceList.add(recorderSurface);

mImageReaderYuv = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.YUV_420_888, 2);
surfaceList.add(mImageReaderYuv.getSurface());

等录像流。

7.14、视频夜景

生效场景: 录像

Mode: Mode.VIDEO_SUPERNIGHT

无需设置其他参数

此模式必须配置以下3路流:

①预览

Surface previewSurface1 = new Surface(texture1);
mPreviewBuilder.addTarget(previewSurface1);
surfaceList.add(previewSurface1);

②拍照

mImageReaderJpeg = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.JPEG, 2);
mImageReaderJpeg.setOnImageAvailableListener(reader -> {
}, mBackgroundHandler);
surfaceList.add(mImageReaderJpeg.getSurface());

③录像

Surface recorderSurface = mMediaRecorder.getSurface();
mPreviewBuilder.addTarget(recorderSurface);
surfaceList.add(recorderSurface);

mImageReaderYuv = ImageReader.newInstance(mVideoSize.getHeight(), mVideoSize.getWidth(), ImageFormat.YUV_420_888, 2);
surfaceList.add(mImageReaderYuv.getSurface());

等录像流。

8、获取高帧率

该方法用于获取30~120FPS的高帧率列表,120FPS及以上请通过android标准高帧率接口获取。通过camera2 API的帧率设置方法设置即可。这个接口获取到的高帧率不建议与MiCamera开放的能力共用,有可能引起丢帧。

SDK Function:

/** 
* @param cameraID 
* @return all high FPS ranges for cameraID 
*/  
public List<MiHFpsInfo> getSupportedHFpsRange(String cameraID)  

9、获取SAT zoom范围

此方法用于获取拍照SAT Camera的zoom范围

SDK Function:

/** 
* @param characteris 
* @return the SAT Zoom Range 
*/  
public Range<Float> getSATZoomRange (CameraCharacteristics characteristics) 

区别于拍照SAT,此方法用于获取录像SAT的zoom范围

SDK Function:

/** 
* @param characteris 
* @return the Video SAT Zoom Range 
*/  
public Range<Float> getVideoSATZoomRange (CameraCharacteristics characteristics) 

获取录像YUV格式

此方法用于YUV录像时,获取YUV的格式

SDK Function:

/** 
* @param characteris 
* @return the YUV format of this device
* YUV_FORMAT_INVALID = -1;
* YUV_FORMAT_NV12 = 1;
* YUV_FORMAT_NV21 = 2;*/  
public int getYUVFormat (CameraCharacteristics characteristics) 

10、获取video SAT zoom范围

该方法用于获取SAT Video 的zoom范围

SDK Function:

/** 
* @param characteris 
* @return the Video SAT Zoom Range
*/  
public Range<Float> getVideoSATZoomRange (CameraCharacteristics characteristics)

11、获取SAT min focus distance

该方法用于获取SAT的min focus distance

SDK Function:

/** 
* @param CaptureResult
* @return SATMinFocusDistance
*/  
public Float getSATMinFocusDistance(CaptureResult result)
文档内容是否有帮助?
有帮助
无帮助