RTC视频设备管理

更新时间:2025-03-20 02:06:23

视频设备管理是RTC核心能力之一,阿里云ARTC SDK提供了丰富的API方便用户管理,不同平台有较大差异,下面将为您介绍RTC引擎的视频设备管理功能。

功能描述

阿里云ARTC SDK的视频设备管理功能为开发者提供了便捷且全面的设备控制能力。该功能能够对不同平台(如 iOS、Android、Windows)的视频输入输出设备进行枚举,并获取设备名称、ID等详细信息,以便开发者根据需求进行选择。此外,SDK还支持对摄像头参数进行精细配置,包括焦距、曝光、手动对焦和人脸对焦等,从而优化采集质量。

功能实现

Windows
Android
iOS

Windows平台可以通过USB使用外置摄像头,因此提供了相对较丰富的API来支持设备管理。

一、 枚举系统链接的摄像头列表和调整使用的摄像头

  1. 通过QUERY_INTERFACE获取 AliEngineInterfaceVideoDeviceManger 接口。

  2. 使用AliEngineInterfaceVideoDeviceManger接口的函数枚举当前设备。

  3. 使用 SetCurrentCameraName/SetCurrentCameraID设置当前使用的摄像头。

/*
   枚举链接到当前系统上的视频采集设备列表
*/

IAliEngineVideoDeviceManager* videoDeviceManger = nullptr;
  QUERY_INTERFACE(mpEngine, AliEngineInterfaceVideoDeviceManger, videoDeviceManger);

  AliEngineDeviceInfoList* deviceInfoList = nullptr;
  if (videoDeviceManger == nullptr)
  {
    return;
  }

  deviceInfoList = videoDeviceManger->GetCameraList();
  if (deviceInfoList == nullptr)
  {
    videoDeviceManger->Release();
    return;
  }

  for (uint32_t i = 0; i < deviceInfoList->GetCount(); i++) {
    CString cameraName = AliStringToCString(deviceInfoList->GetDeviceInfo(i).deviceName.c_str());
    dlg.maCameraList.Add(cameraName);

    CString cameraNameId = AliStringToCString(deviceInfoList->GetDeviceInfo(i).deviceID.c_str());
    dlg.maCameraIdList.Add(cameraNameId);
  }

  deviceInfoList->Release();

/*
  获取当前的设备名称和ID
*/
 dlg.msCurCamera = AliStringToCString(videoDeviceManger->GetCurrentCameraName());
  dlg.msCurCameraId = AliStringToCString(videoDeviceManger->GetCurrentCameraID());
  videoDeviceManger->Release();

/*
  设置使用的摄像头
*/
if (dlg.msCurCamera.Compare(L"") != 0)
        videoDeviceManger->SetCurrentCameraName(CStringToAliString(dlg.msCurCamera).c_str());

  

二、配置摄像头采集属性

调用SetCameraCapturerConfiguration配置摄像头采集属性。

/**
* @brief 设置摄像头采集偏好
* @param config 采集偏好
* - preference:
*   - {@link AliEngineCaptureOutputPreference::AliEngineCaptureOutputPreferencePreview} 高清预览,采集优先保证视频预览质量
*   - {@link AliEngineCaptureOutputPreference::AliEngineCaptureOutputPreferencePerformance} 采集选择最接近推流的分辨率,优先保证设备性能
*   - {@link AliEngineCaptureOutputPreference::AliEngineCaptureOutputPreferenceAuto} 自动调整采集分辨率
* 
* - cameraDirection: 设置采集方向,前置 或 后置,仅对android和ios有效
* @return
* - 0: 成功
* - 非0: 失败
* @note 必须在打开摄像头之前设置,如 {@link StartPreview},{@link JoinChannel}之前设置
*/

virtual int SetCameraCapturerConfiguration(const AliEngineCameraCapturerConfiguration& config) = 0;


/*
调用 sample 
*/

AliEngineCameraCapturerConfiguration cameraCapture;
	cameraCapture.preference = AliEngineCaptureOutputPreferencePerformance;
	mpEngine->SetCameraCapturerConfiguration(cameraCapture);
	

三、开启/关闭摄像头

MuteLocalCamera是控制推黑帧,采集和推流不会停止,适用于某些特殊场合。

/**
* @brief 开启本地视频预览
* @return
* - 0: 成功
* - 非0: 失败
* @note 如果没有调用 {@link SetLocalViewConfig} 设置显示的view,则无法预览。
*       可以在{@link JoinChannel}之前就开启预览会自动打开摄像头。
*/
virtual int StartPreview(int width = 0, int height = 0) = 0;

        
/**
* @brief 关闭本地视频预览
* @return
* - 0: 成功
* - 非0: 失败
* @note {@link LeaveChannel} 会自动停止本地预览;如果没有在推相机流,则会自动关闭摄像头。
*/
virtual int StopPreview() = 0;



/**
* @brief 禁用或启用本地视频采集
* @param enabled
* - true : 启用本地视频采集
* - false : 禁用本地视频采集
* @return
* - 0: 成功
* - 非0: 失败
* @note 默认为开启状态, 通过监听 {@link AliEngineEventListener::OnUserVideoEnabled} 获取用户是否禁用或启用本地视频采集状态。
*/
virtual int EnableLocalVideo(bool enabled) = 0;

/**
* @brief 停止/恢复本地视频数据发送
* @param mute true表示视频数据发送黑帧;false表示恢复正常
* @param track 只支持{@link AliEngineVideoTrackCamera}
* @return
* - 0: 成功
* - 非0: 失败
* @note 此接口只是控制指定视频流上是否发送黑帧,采集和数据发送不会停止
* @note 如果需要关闭采集请使用 {@link EnableLocalVideo} 接口,如果需要中止视频数据发送请使用 {@link PublishLocalVideoStream} 接口
*/
virtual int MuteLocalCamera(bool mute, AliEngineVideoTrack track) = 0;

一、配置摄像头

setCameraCapturerConfiguration用来配置摄像头,在开启摄像头之前配置。

 /**
     * @brief 采集偏好设置
     * @param cameraCapturerConfiguration 偏好设置
     *      - preference:
     *        - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_PREVIEW} 高清预览,采集优先保证视频预览质量
     *        - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_PERFORMANCE} 采集选择最接近推流的分辨率,优先保证设备性能
     *        - {@link AliRtcCaptureOutputPreference#ALIRTC_CAPTURER_OUTPUT_PREFERENCE_AUTO} 自动调整采集分辨率
     *      - cameraDirection: 设置采集方向,前置或后置摄像头
     * @return
     * - 0: 成功
     * - 非0: 表示失败
     * @note 必须在打开摄像头之前设置,如{@link #startPreview},{@link #joinChannel}之前设置
     */


public abstract int setCameraCapturerConfiguration(AliEngineCameraCapturerConfiguration cameraCapturerConfiguration);

二、开启/关闭摄像头

/**
     * @brief 开启本地视频预览
     * @details 开启本地视频预览并自动打开摄像头
     * @return
     * - 0 : 成功
     * - < 0 : 失败
     * @note 如果没有调用{@link #setLocalViewConfig}设置显示的view,则无法预览,但不影响推流。
     * 可以在{@link #joinChannel}之前就开启预览会自动打开摄像头。
     */
    public abstract int startPreview();

    /**
     * @brief 关闭本地视频预览
     * @details 关闭本地视频预览并关闭摄像头
     * @return
     * - 0 : 成功
     * - < 0 : 失败
     * @note {@link #leaveChannel}会自动停止本地预览;如果没有在推相机流,则会自动关闭摄像头。
     */
    public abstract int stopPreview();



    /**
     * @brief 禁用或启用本地视频采集
     * @param enabled
     * - true : 启用本地视频采集
     * - false : 禁用本地视频采集
     * @return
     * - 0 : 成功
     * - < 0 : 失败
     * @note 默认为开启状态, 通过监听 {@link AliRtcEngineNotify#onUserVideoEnabled} 获取用户是否禁用或启用本地视频采集状态。
     */
    public abstract int enableLocalVideo(boolean enabled);

    /**
     * 是否将停止本地视频数据发送
     * @param mute     true表示视频数据发送黑帧;false表示恢复正常
     * @param track    只支持{@link AliRtcVideoTrack#AliRtcVideoTrackCamera}
     * @return
     * - 0: 成功
     * - 非0: 失败
     * @note 发送黑色的视频帧。本地预览也呈现黑色。采集,编码,发送模块仍然工作,只是视频内容是黑色帧
     */
    public abstract int muteLocalCamera(boolean mute, AliRtcVideoTrack track);

   /**
     * @brief 检查camera是否打开
     * @return
     * - true: 摄像头已打开
     * - false: 摄像头没有打开
     * @note 该接口用于检查当前camera的状态
     */
    public abstract boolean isCameraOn();

三、切换前后置摄像头

  /**
     * @brief 切换前后摄像头
     * @return
     * - 0: 成功
     * - 非0: 失败
     * @note 只有iOS和android提供这个接口
     */
    public abstract int switchCamera();

    /**
     * @brief 获取摄像头方向
     * @return 摄像头方向
     * - CAMERA_REAR(0) : 后置
     * - CAMERA_FRONT(1) : 前置
     * - CAMERA_INVALID(-1) : 无效
     * @note 只有iOS和android提供这个接口,在Camera已经open之后调用,否则会返回 {@link AliRtcCameraDirection#CAMERA_INVALID}
     */
    public abstract AliRtcCameraDirection getCurrentCameraDirection();

四、实时调整摄像头采集设置

说明

调用CameraFocusPoint/CameraExposurePoint/CameraAutoFocusFaceMode接口之前建议调用isXXXsupported来判断是否支持该功能。

 /**
     * @brief 设置摄像头zoom
     * @param zoom 缩放级别,范围从 1 到 camera支持的最大 zoom值
     * @return
     * - 0: 成功
     * - 非0: 失败
     * @note 只有iOS和android提供这个接口
     */
    public abstract int setCameraZoom(float zoom);

     /**
     * @brief 获取摄像头最大缩放比例
     * @return 摄像头最大缩放比例
     */
    public abstract float GetCameraMaxZoomFactor();
    
    /**
     * @brief 获取摄像头缩放比例
     * @return 摄像头缩放比例
     */
    public abstract float GetCurrentZoom();
    
    /**
     * @brief 设置摄像头曝光度
     * @param exposure 曝光度
     * @return
     * - 0: 成功
     * -非0: 失败
     */
    public abstract int SetExposure(float exposure);
    
    /**
     * @brief 获取摄像头曝光度
     * @return 摄像头曝光度
     */
    public abstract float GetCurrentExposure();
    
    /**
     * @brief 获取摄像头最小曝光度
     * @return 摄像头最小曝光度
     */
    public abstract float GetMinExposure();
    
    /**
     * @brief 获取摄像头最大曝光度
     * @return 摄像头最大曝光度
     */
    public abstract float GetMaxExposure();

    /**
     * @brief 设置摄像头闪光灯开关
     * @param flash 是否打开闪光灯
     * @return
     * - 0: 设置成功
     * - 非0: 设置失败
     * @note 只有iOS和android提供这个接口,一般后置摄像头有闪光灯功能
     */
    public abstract int setCameraFlash(boolean flash);

    /**
     * @brief 是否支持摄像头手动聚焦
     * @return
     * - true: 支持
     * - false: 不支持
     * @note 只有iOS和android提供这个接口,用来检查当前camera是否可以设置聚焦点
     */
    public abstract boolean isCameraFocusPointSupported();

    /**
     * @brief 是否支持设置摄像头曝光点
     * @return
     * - true: 支持
     * - false: 不支持
     * @note 只有iOS和android提供这个接口,用来检查当前camera是否可以设置曝光点
     */
    public abstract boolean isCameraExposurePointSupported();

    /**
     * @brief 设置摄像头手动聚焦点
     * @param x x轴坐标值
     * @param y y轴坐标值
     * @return
     * - 0: 成功
     * - 非0: 失败
     * @note 只有iOS和android提供这个接口,调用后camera对所设点做一次曝光调整,后面一直保持这个对焦值
     */
    public abstract int setCameraFocusPoint(float x, float y);

    /**
     * @brief 设置摄像头曝光点
     * @param x x轴坐标值
     * @param y y轴坐标值
     * @return
     * - 0: 成功
     * - 非0: 失败
     * @note 只有iOS和android提供这个接口,调用后camera对所设点做一次曝光调整,后面一直保持这个曝光值
     */
    public abstract int setCameraExposurePoint(float x, float y);

    /**
     * @brief 是否支持摄像头自动人脸聚焦
     * @return
     * - true: 支持
     * - false: 不支持
     * @note 只有iOS和android提供这个接口,在camera没有打开的情况下返回false,
     *       在camera打开的情况下,如果当前camera同时支持人脸识别和对焦功能则返回true
     */
    public abstract boolean isCameraAutoFocusFaceModeSupported();

    /**
     * @brief 设置摄像头人脸聚焦
     * @param enable
     * - true: 开启
     * - false: 关闭
     * @return
     * - true: 成功
     * - false: 失败
     * @note 只有iOS和android提供这个接口,如果{@link AliRtcEngine#isCameraAutoFocusFaceModeSupported}返回true
     *       且此调用enable为true的情况下,实时对焦到采集到数据的人脸上
     */
    public abstract boolean setCameraAutoFocusFaceModeEnabled(boolean enable);

一、配置摄像头

setCameraCapturerConfiguration用来配置摄像头,在开启摄像头之前配置。

/**
 * @brief 设置camera采集偏好
 * @param config 偏好设置
 *      - preference: {@link AliRtcCaptureOutputPreference::AliRtcCaptureOutputPreferencePreview} 高清预览,采集优先保证视频预览质量
 *                    {@link AliRtcCaptureOutputPreference::AliRtcCaptureOutputPreferencePerformance} 采集选择最接近推流的分辨率,优先保证设备性能
 *                    {@link AliRtcCaptureOutputPreference::AliRtcCaptureOutputPreferenceAuto} 自动调整采集分辨率
 *      - cameraDirection: 设置采集方向,前置摄像头或后置摄像头
 * @return
 * - 0: 成功
 * - 非0: 失败
 * @note 必须在打开摄像头之前设置,如 {@link AliRtcEngine::startPreview},{@link AliRtcEngine::joinChannel:name:onResult:} / {@link AliRtcEngine::joinChannel:name:onResultWithUserId:}之前设置
 */
- (int)setCameraCapturerConfiguration:(AliRtcCameraCapturerConfiguration* _Nonnull )config;

二、开启/关闭摄像头

/**
 * @brief 开启本地视频预览
 * @return
 * - 0 : 成功
 * - <0 : 失败
 * @note 如果没有调用 {@link setLocalViewConfig:forTrack:} 设置显示的view,则无法预览。
 * 可以在 {@link joinChannel:name:onResultWithUserId:} 之前就开启预览会自动打开摄像头。
 */
- (int)startPreview;

/**
 * @brief 关闭本地视频预览
 * @return
 * - 0 : 成功
 * - < 0 : 失败
 * @note {@link leaveChannel} 会自动停止本地预览;如果没有在推相机流,则会自动关闭摄像头。
 */
- (int)stopPreview;

/**
 * @brief 检查camera是否打开
 * @return
 * - YES: 表示摄像头已打开
 * - NO: 表示摄像头没有打开
 * @note 该接口用于检查当前camera的状态
 */
- (BOOL)isCameraOn;

/**
 * @brief 禁用或启用本地视频采集
 * @param enabled
 * - YES : 启用本地视频采集
 * - NO : 禁用本地视频采集
 * @return
 * - 0 : 成功
 * - < 0 : 失败
 * @note 默认为开启状态, 通过监听 {@link #onUserVideoEnabled:videoEnabled: } 获取用法是否禁用或启用本地视频采集状态。
 */
- (int)enableLocalVideo:(BOOL)enabled;

/**
 * @brief 是否将停止本地视频数据发送
 * @param mute  YES表示视频数据发送黑帧;NO表示恢复正常
 * @param track  只支持 {@link AliRtcVideoTrackCamera}
 * @return
 * - 0: 表示Success
 * - 非0: 表示Failure
 * @note 发送黑色的视频帧。本地预览也呈现黑色。采集,编码,发送模块仍然工作,
 *       只是视频内容是黑色帧
*/
- (int)muteLocalCamera:(BOOL)mute forTrack:(AliRtcVideoTrack)track;

三、切换前后置摄像头

/**
 * @brief 切换前后摄像头
 * @return
 * - 0: 成功
 * - 非0: 失败
 * @note 只有iOS和android提供这个接口
 */
- (int)switchCamera;

/**
 * @brief 获取当前摄像头方向,默认前置摄像头
 * @return 摄像头方向
 * - AliRtcCameraDirectionFront 前置
 * - AliRtcCameraDirectionBack 后置
 * - AliRtcCameraDirectionInvalid 无效
 * @note 只有iOS和android提供这个接口,在Camera 已经open之后调用,否则会返回 {@link AliRtcCameraDirectionInvalid}
 */
- (AliRtcCameraDirection)getCurrentCameraDirection;

四、实时调整摄像头采集设置

说明

调用CameraFocusPoint/CameraExposurePoint/CameraAutoFocusFace接口之前建议调用isXXXsupported接口来判断是否支持该功能。

/**
 * @brief 设置摄像头缩放
 * @param zoom   缩放级别,范围从 1 到 camera支持的最大 zoom值
 * @return
 * - 0: 成功
 * - 非0: 失败
 * @note 只有iOS和android提供这个接口
 */
 - (int)setCameraZoom:(float)zoom;

/**
 * @brief 获取摄像头最大缩放比例
 * @return 摄像头最大缩放比例
 * @note 只有IOS和Android提供这个接口
 */
 - (float)GetCameraMaxZoomFactor;

/**
 * @brief 获取摄像头最大缩放比例
 * @return 摄像头最大缩放比例
 */
- (float)GetCurrentZoom;

/**
 * @brief 设置摄像头曝光度
 * @param exposure 曝光度
 * @return
 * - 0: 成功
 * -非0: 失败
 */
- (int)SetExposure:(float)exposure;

/**
 * @brief 获取摄像头曝光度
 * @return 摄像头曝光度
 */
- (float)GetCurrentExposure;

/**
 * @brief 获取摄像头最小曝光度
 * @return 摄像头最小曝光度
 */
- (float)GetMinExposure;

/**
 * @brief 获取摄像头最大曝光度
 * @return 摄像头最大曝光度
 */
- (float)GetMaxExposure;

/**
 * @brief 设置摄像头闪光灯开关
 * @param flash  是否打开闪光灯
 * @return
 * - 0: 成功
 * - 非0: 失败
 * @note 只有iOS和android提供这个接口,一般后置摄像头有闪光灯功能
 */
- (int)setCameraFlash:(BOOL)flash;

/**
 * @brief 摄像头是否支持手动聚焦
 * @return
 * - YES: 支持
 * - NO: 不支持
 * @note 只有iOS和android提供这个接口,用来检查当前camera是否可以设置聚焦点
 */
- (BOOL)isCameraFocusPointSupported;

/**
 * @brief 摄像头是否支持设置曝光点
 * @return
 * - YES: 支持
 * - NO: 不支持
 * @note 只有iOS和android提供这个接口,用来检查当前camera是否可以设置曝光点
 */
- (BOOL)isCameraExposurePointSupported;

/**
 * @brief 设置摄像头手动聚焦点
 * @param point   聚焦点坐标
 * @return
 * - 0: 成功
 * - 非0: 失败
 * @note 只有iOS和android提供这个接口,调用后camera对所设点做一次曝光调整,后面一直保持这个对焦值
 */
- (int)setCameraFocusPoint:(CGPoint)point;

/**
 * @brief 设置摄像头曝光点
 * @param point  曝光点
 * @return
 * - 0: 成功
 * - 非0: 失败
 * @note 只有iOS和android提供这个接口,调用后camera对所设点做一次曝光调整,后面一直保持这个曝光值
 */
- (int)setCameraExposurePoint:(CGPoint)point;

/**
 * @brief 摄像头是否支持人脸聚焦
 * @return
 * - YES: 支持
 * - NO: 不支持
 * @note 只有iOS和android提供这个接口,在camera没有打开的情况下返回 NO,
 *       在camera打开的情况下,如果当前camera同时支持人脸识别和对焦功能则返回 YES
*/
- (BOOL)isCameraAutoFocusFaceModeSupported;

/**
 * @brief 设置摄像头人脸对焦
 * @param enable  YES: 开启; NO:关闭
 * @return
 * - YES: 成功
 * - NO: 失败
 * @note 只有iOS和android提供这个接口,如果 {@link AliRtcEngine::isCameraAutoFocusFaceModeSupported} 返回 YES
 *      且此调用enable为 YES 的情况下,实时对焦到采集到数据的人脸上
*/
- (BOOL)setCameraAutoFocusFaceModeEnabled:(BOOL)enable;
  • 本页导读 (1)
  • 功能描述
  • 功能实现