视频设备管理是RTC核心能力之一,阿里云ARTC SDK提供了丰富的API方便用户管理,不同平台有较大差异,下面将为您介绍RTC引擎的视频设备管理功能。
功能描述
阿里云ARTC SDK的视频设备管理功能为开发者提供了便捷且全面的设备控制能力。该功能能够对不同平台(如 iOS、Android、Windows)的视频输入输出设备进行枚举,并获取设备名称、ID等详细信息,以便开发者根据需求进行选择。此外,SDK还支持对摄像头参数进行精细配置,包括焦距、曝光、手动对焦和人脸对焦等,从而优化采集质量。
功能实现
Windows平台可以通过USB使用外置摄像头,因此提供了相对较丰富的API来支持设备管理。
一、 枚举系统链接的摄像头列表和调整使用的摄像头
通过
QUERY_INTERFACE
获取AliEngineInterfaceVideoDeviceManger
接口。使用
AliEngineInterfaceVideoDeviceManger
接口的函数枚举当前设备。使用
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)
- 功能描述
- 功能实现