iOS

# 设备管理

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

# 1. 音频设备管理

# 音频参数设置

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

参数 描述
audioInputDevice (opens new window) 音频输入设备
audioOutputDevice (opens new window) 音频输出设备
audioInputSamplingRate (opens new window) 音频输入采样率
audioOutputSamplingRate (opens new window) 音频输出采样率
audioInputChannelNumber (opens new window) 音频输入通道数量
audioOutputChannelNumber (opens new window) 音频输出通道数量
androidAudioMode (opens new window) Android 声音模式

# 扬声器的开启关闭

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

示例代码:

// 关闭扬声器(听筒模式)
mediaDevice.enableSpeaker(false);
// 打开扬声器
mediaDevice.enableSpeaker(true);

# 获取麦克风音量级别

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

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

示例代码:

//获取本地音量采集级别
mediaDevice.getMicLevel();

# 获取扬声器音量级别

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

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

示例代码:

//获取本地扬声器的音量级别
mediaDevice.getSpkLevel();

# 获取当前噪声强度

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

# 获取当前信噪比强度

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

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

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

/**
 * 打开音频输入设备
 *
 * @param audioInput 音频输入设备
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean startAudioInput(JRTCMediaDeviceAudio audioInput);

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

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

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

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

/**
 * 关闭当前打开的音频输出设备
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean stopAudioOutput();

# 检测音频设备是否正常

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

/**
 * 检测音频设备是否正常
 *
 * @param type        音频设备类型
 * @param fileName    测试扬声器时播放的文件路径,测试麦克风时传 null 即可
 * @param audioDevice 测试的音频设备,输入设备或者输出设备
 * @return 方法调用是否成功
 * @see DeviceTestType
 * @see DeviceTestType
 */
public abstract boolean startAudioTest(@DeviceTestType int type, String fileName, JRTCMediaDeviceAudio audioDevice);

/**
 * 停止检测音频设备
 * 注意:开启某项音频设备检测完成后,需停止对应的测试,避免影响后续的音频设备的使用
 *
 * @param type 音频设备类型
 * @return 方法是否调用成功
 * @see DeviceTestType
 */
public abstract boolean stopAudioTest(@DeviceTestType int type);

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

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

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

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

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

/**
 * 开启或关闭本地麦克风的增益(软件增益),默认开启
 *
 * @param enable 回调对象
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 * @note 需要在建立通话后调用
 */
public abstract boolean enableMicAgc(boolean enable);

# 2. 视频设备管理

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

# 获取摄像头列表

/**
 * 获取摄像头列表
 * @return 摄像头列表
 */
public abstract List<JRTCMediaDeviceCamera> getCameras();

示例代码:

// 获取所有可用的摄像头列表
List<JRTCMediaDeviceCamera> cameras = mediaDevice.getCameras();

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

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

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

示例代码:

// 获取所有可用的摄像头列表
List<JRTCMediaDeviceCamera> cameras = mediaDevice.getCameras();
// 指定要开启的摄像头
mediaDevice.specifyCamera(cameras.get(0));
// 指定摄像头采集角度为90度
mediaDevice.specifyCameraAngle(90);

# 摄像头采集属性

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

/**
 * 设置屏幕共享采集属性
 *
 * 在调用 {@link #enableScreenCapture} 接口开启屏幕共享前设置即可生效
 * @param width     采集宽度,默认1280
 * @param height    采集高度,默认720
 * @param frameRate 采集帧速率,默认10
 */
public abstract void setScreenCaptureProperty(int width, int height, int frameRate);

示例代码:

mediaDevice.setCameraProperty(640, 360, 24);

# 打开/关闭摄像头

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

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

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

示例代码:

// 打开本地摄像头
mediaDevice.startCamera();
// 关闭本地摄像头
mediaDevice.stopCamera();

# 切换摄像头

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

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

/**
 * 切换摄像头,用于手机前置和后置摄像头的切换
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean switchCameraBetweenFrontAndBack();

示例代码:

// 切换摄像头
mediaDevice.switchCamera();
// 切换至指定摄像头
mediaDevice.switchCamera(mediaDevice.getCameras.get(0));
// 前后置摄像头切换
mediaDevice.switchCameraBetweenFrontAndBack();

# 摄像头变化回调

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

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

# 停止所有视频渲染

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