iOS

# 设备管理

Juphoon RTC SDK 支持设备设置摄像头相关参数与配置,并在提供进入会议前的视频设备测试方法。

# 1. 音频设备管理

# 音频参数设置

设置 JRTCMediaDeviceAudioParam (opens new window) 音频参数,在加入通话前设置生效,若不设置参数,使用 SDK 默认值。

参数 描述
audioInputSamplingRate (opens new window) 音频输入采样率
audioOutputSamplingRate (opens new window) 音频输出采样率
audioInputChannelNumber (opens new window) 音频输入通道数量
audioOutputChannelNumber (opens new window) 音频输出通道数量

# 扬声器的开启关闭

/**
 * 开启/关闭扬声器
 *
 * 只有在音频已经启动的情况下调用才会生效
 *
 * @param enable 开启或关闭扬声器
 * - true: 开启
 * - false: 关闭
 */
- (void)enableSpeaker:(bool)enable;

示例代码:

// 关闭扬声器(听筒模式)
[_mediaDevice enableSpeaker:false];

// 打开扬声器
[_mediaDevice enableSpeaker:true];

# 获取麦克风音量级别

打开音频采集后就可以调用 getMicLevel (opens new window)接口获取当前麦克风的采集音量级别,与通话状态无关。

/**
 * 获取当前麦克风音量级别,录制音量级别范围为 0 到 100
 *
 * 目前只在开始麦克风检测,或者当会议上有音频时,才能获取到有效的录制音量级别。
 * @return 麦克风音量级别
 */
- (int)getMicLevel;

示例代码:

int micLevel = [_mediaDevice getMicLevel];

# 获取扬声器音量级别

打开音频输出后就可以调用 getSpkLevel (opens new window) 接口获取当钱的扬声器的音量级别,与通话状态无关。

/**
 * 获取当前扬声器音量级别,播放音量级别范围为 0 到 100
 *
 * 目前只在开始扬声器检测,或者当会议上有人讲话时,才能获取到有效的录制音量级别。
 * @return 扬声器音量级别
 */
- (int)getSpkLevel;

示例代码:

int spkLevel = [_mediaDevice getSpkLevel];

# 获取当前噪声强度

/**
 * 获取当前噪声强度
 * 环境平均噪声强度(1s), 检测需要打开麦克风 {@link JRTCMediaDevice.startAudio startAudio} 或者 {@link JRTCMediaDevice.startAudioInput startAudioInput}
 * @return 噪声强度
 * - -1:获取失败
 * - 0-50dB:噪声非常微弱
 * - 50-60dB:噪声较弱
 * - 60-70dB:噪声较强
 * - 70dB以上:噪声非常强
 */
- (int)getAnrNoiseLevel;

# 获取当前信噪比强度

/**
 * 获取当前信噪比强度
 * 环境平均信噪比强度(1s), 检测需要打开麦克风 {@link JRTCMediaDevice.startAudio  startAudio} 或者 {@link JRTCMediaDevice.startAudioInput startAudioInput}
 * @return 噪声强度
 * - -1:获取失败
 * - 0-20dB:噪声明显,语音含糊,较难听清
 * - 20-40dB:语音基本能听清,但有一定的噪声
 * - 40dB以上:语音非常清晰
 */
- (int)getAnrNoiseRatio;

# 打开/关闭音频输入设备

在通话中通过调用 stopAudioInput (opens new window)关闭当前音频输入设备,startAudioInput (opens new window) 打开指定音频输入设备,可以完成切换音频设备的操作。

/**
 * 打开音频输入设备
 * @return 调用是否成功
 * - true: 调用成功
 * - false: 调用失败
 */
- (bool)startAudioInput;

/**
 * 关闭音频输入设备
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)stopAudioInput;

# 打开/关闭音频输出设备

在通话中调用 stopAudioOutput (opens new window) 关闭当前音频输出设备,startAudioOutput (opens new window) 打开指定音频输出设备,可以完成切换音频输出设备的操作。

/**
 * 打开音频输出设备
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)startAudioOutput;

/**
 * 关闭音频输出设备
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)stopAudioOutput;

# 检测音频设备是否正常

调用 startAudioTest (opens new window)stopAudioTest (opens new window) 对音频设备进行开始检测和停止检测。

/**
 * 检测音频设备是否正常
 * @param type              音频设备类型,@ref JRTCMediaDeviceTestType
 * @param fileName     测试扬声器时播放的文件路径,测试麦克风是传 nil 即可
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)startAudioTest:(JRTCMediaDeviceTestType)type fileName:(NSString *__nullable)fileName;

/**
 * 停止检测音频设备
 * @warning 开启某项音频设备检测完成后,需停止对应的测试,避免影响后续的音频设备使用。
 * @param type     音频设备类型,@ref JRTCMediaDeviceTestType
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)stopAudioTest:(JRTCMediaDeviceTestType)type;

# 设置开启自适应回声消除

/**
 * 设置开启自适应回声消除
 * @note 需要在打开音频输入设备 {@link #startAudioInput()} 或者 {@link #startAudio()} 前调用才生效
 *
 * @param aecOn 是否开启自适应回声消除
 */
- (void)setAec:(bool)aecOn;

# 设置是否开启自动增益控制

/**
 * 设置是否开启自动增益控制
 * @note 需要在打开音频输入设备 {@link #startAudioInput()} 或者 {@link #startAudio()} 前调用才生效
 *
 * @param agcOn 是否开启自动增益控制
 */
- (void)setAgc:(bool)agcOn;

# 开启或关闭本地麦克风的增益(软件增益)

/**
 * 开启或关闭本地麦克风的增益(软件增益),默认开启
 * @note 需要在加入房间后调用
 *
 * @param enable 是否开启麦克风增益
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)enableMicAgc:(bool)enable;

# 2. 视频设备管理

在视频场景中,您可能需要根据实际的情况选择视频的采集设备,以及相关的采集参数。

# 获取摄像头列表

当前可用的所有摄像头列表。

/**
 * 摄像头列表
 */
@property (nonatomic, readonly, nonnull) NSArray<JRTCMediaDeviceCamera*> *cameras;

示例代码:

// 获取所有可用的摄像头列表
NSArray<JRTCMediaDeviceCamera*> *cameras = _mediaDevice.cameras;

# 指定摄像头/指定摄像头采集角度

需在 startCamera (opens new window) 之前调用

/**
 * 指定要开启的摄像头,在 {@link startCamera} 之前调用
 * @param camera 摄像头对象
 */
- (void)specifyCamera:(JRTCMediaDeviceCamera* __nonnull)camera;

/**
 * 指定摄像头采集角度,为90的倍数
 * @param angle 角度
 */
- (void)specifyCameraAngle:(int)angle;

示例代码:

// 指定要开启的摄像头
[_mediaDevice specifyCamera:_mediaDevice.cameras[0]];

// 指定摄像头采集角度
[_mediaDevice specifyCameraAngle:180];

# 摄像头采集属性

调用 startCamera (opens new window)接口之前生效,设置摄像头的采集参数。

/**
* 设置摄像头采集属性
*
* 在调用开始自身视频渲染前设置即可生效
*
* @param width     采集宽度,默认为 640
* @param height    采集高度,默认为 360
* @param framerate 采集帧速率,默认为 30
*/
- (void)setCameraProperty:(int)width height:(int)height framerate:(int)framerate;

示例代码:

[_mediaDevice setCameraProperty:640 height:360 framerate:24];

# 打开/关闭摄像头

注:直接开启本地视频预览 startCameraVideo (opens new window) ,SDK 内部会默认打开本地摄像头,不需要单独调用该接口。

/**
 * 开启摄像头
 *
 * @note 调用此方法时需要保证默认摄像头不为空,即 @ref defaultCamera 不为空,否则将直接返回 false
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 *  - 若调用此方法前摄像头已打开,不会收到回调通知
 *  - 若调用此方法前摄像头未打开,会收到 {@link JRTCMediaDeviceCallback.onCameraUpdate onCameraUpdate} 回调
 * - false: 接口调用异常
 */
- (bool)startCamera;

/**
 * 关闭摄像头
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 *  - 调用此方法前摄像头未打开,不会收到回调通知
 *  - 调用此方法前摄像头已打开,会收到 {@link JRTCMediaDeviceCallback.onCameraUpdate onCameraUpdate} 回调
 * - false: 接口调用异常
 */
- (bool)stopCamera;

示例代码:

// 打开摄像头
[_mediaDevice startCamera];

// 关闭摄像头
[_mediaDevice stopCamera];

# 切换摄像头

/**
 * 切换摄像头
 *
 * 内部会根据当前摄像头类型来进行切换
 *
 * - 调用此方法时要保证摄像头已打开,否则将直接返回 false
 * - 设备拥有两个以上摄像头,否则将直接返回 true
 * - 满足以上两个条件后,内部会调用 {@link switchCamera: } 接口并提供返回值
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
- (bool)switchCamera;

/**
 * 切换到指定摄像头
 *
 * 调用此方法时需要保证摄像头已打开并且摄像头数大于0,否则将直接返回 false
 *
 * @param camera 摄像头对象
 * @return 接口调用结果
 * - true: 接口调用成功
 *  - 摄像头个数 == 1,不会收到回调
 *  - 摄像头个数 > 1,会收到 {@link JRTCMediaDeviceCallback.onCameraUpdate onCameraUpdate} 回调
 * - false: 接口调用异常,不会收到回调
 */
- (bool)switchCamera:(JRTCMediaDeviceCamera* __nonnull)camera;

示例代码:

// 切换摄像头
[_mediaDevice switchCamera];

// 切换至指定摄像头
[_mediaDevice switchCamera:_mediaDevice.cameras[0]];

# 摄像头变化回调

通过实现 onCameraUpdate (opens new window) 接口监听摄像头变化。

/**
 * 摄像头变化回调
 *
 * 摄像头状态发生变化会收到此回调,例如打开、关闭、切换摄像头
 */
- (void)onCameraUpdate;

# 停止所有视频渲染

/**
 * 停止所有视频渲染
 */
- (void)stopAllVideos;