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;

# 2. 视频设备管理

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

# 获取摄像头列表

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

示例代码:

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

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

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

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

示例代码:

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

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

# 摄像头采集属性

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

示例代码:

// 设置采集宽1080 高 720 帧率24
[_mediaDevice setCameraProperty:1080 height:720 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]];