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 麦克风音量级别,返回-1获取失败
 */
- (int)getMicLevel;

示例代码:

//获取本地音量采集级别
int micLevel = [_mediaDevice getMicLevel];

# 获取扬声器音量级别

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

/**
 * 获取当前扬声器音量级别,音量级别范围为0-100,用以测试设备
 * 目前只在开始扬声器检测,或者当房间内有输出音频时,才能获取到有效的音量级别
 *
 * @return 扬声器音量级别,返回-1获取失败
 */
- (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;

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

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

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

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

# 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;

示例代码:

// 获取所有可用的摄像头列表
NSArray<JRTCMediaDeviceCamera*> *cameras = _mediaDevice.cameras;
// 指定要开启的摄像头
[_mediaDevice specifyCamera:cameras[0]];
// 指定摄像头采集角度为90度
[_mediaDevice specifyCameraAngle:180];

# 摄像头采集属性

开启本地视频渲染之前,设置摄像头的采集参数。

/**
* 设置摄像头采集属性
*
* 在调用开始自身视频渲染前设置即可生效
*
* @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]];