iOS

# 设备管理

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

# 1. 音频设备管理

在音频场景中,您可能需要根据实际的场地情况选择音频的采集设备和播放设备。

# 音频输入设备

调用 getAudioInputs (opens new window)getOpenedAudioInputs (opens new window) 来分别获取所有音频输入设备列表和使用中的音频输入设备列表。

/**
 * 获取所有音频输入设备列表
 *
 * @return 音频输入设备列表
 */
public abstract List<JRTCMediaDeviceAudio> getAudioInputs();

/**
 * 获取使用中的音频输入设备列表
 *
 * @return 使用中的音频输入设备列表
 */
public abstract List<JRTCMediaDeviceAudio> getOpenedAudioInputs();

# 默认音频输入设备

在加入房间前,您可以通过设置 setDefaultAudioInput (opens new window) 来设置当前需要使用的音频输入的设备,不设置则随机使用一个有效的音频输入设备。

/**
 * 设置默认音频输入设备,可以在业务进行前设置
 */
public abstract void setDefaultAudioInput(JRTCMediaDeviceAudio audioInput);

# 音频输入设备变化回调

您可以通过实现 onAudioInputDeviceChanged (opens new window) 接口,可监听当前音频输入设备切换的回调。

/**
 * 当前音频输入设备切换回调
 *
 * @param audioInput 音频输入设备
 */
void onAudioInputDeviceChanged(JRTCMediaDeviceAudio audioInput);

# 音频输入音量变化通知

音频输入音量的监听,您可以通过实现 onAudioInputVolumeChanged (opens new window) 接口监听。

/**
 * 音频输入音量变化通知
 *
 * @param volume 音量值 0 - 100
 * @param volumeStatus 音量状态
 * - {@link JRTCEnum#VOLUME_STATUS_NONE VOLUME_STATUS_NONE} : 无声音
 * - {@link JRTCEnum#VOLUME_STATUS_VERY_LOW VOLUME_STATUS_VERY_LOW} : 很低
 * - {@link JRTCEnum#VOLUME_STATUS_LOW VOLUME_STATUS_LOW} : 低
 * - {@link JRTCEnum#VOLUME_STATUS_MID VOLUME_STATUS_MID} : 中
 * - {@link JRTCEnum#VOLUME_STATUS_HIGH VOLUME_STATUS_HIGH} : 高
 * - {@link JRTCEnum#VOLUME_STATUS_VERY_HIGH VOLUME_STATUS_VERY_HIGH} : 很高
 */
void onAudioInputVolumeChanged(int volume, @JRTCEnum.VolumeStatus int volumeStatus);

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

在通话中通过调用 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);

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

# 查看音频设备是否打开

查看音频设备是否开启,包括输入和输出音频设备

/**
 * 音频设备是否打开
 */
public abstract boolean isAudioStart();

# 获取麦克风音量级别

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

/**
 * 获取当前本地音量级别,音量级别范围为0-100,用以测试设备
 * 目前只在开始麦克风检测,或者当房间内有输入音频时,才能获取到有效的音量级别
 *
 * @return 麦克风音量级别,返回-1获取失败
 */
public abstract int getMicLevel();

示例代码:

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

# 音频输出设备

调用 getAudioOutputs (opens new window)getOpenedAudioOutput (opens new window) 来分别获取所有音频输入设备列表和使用中的音频输入设备列表。

/**
 * 获取所有音频输出设备列表
 *
 * @return 音频输出设备列表
 */
public abstract List<JRTCMediaDeviceAudio> getAudioOutputs();

/**
 * 获取使用中的音频输出设备
 *
 * @return 使用中的音频输出设备
 */
public abstract JRTCMediaDeviceAudio getOpenedAudioOutput();

# 默认音频输出设备

在加入房间前,您可以通过设置 setDefaultAudioOutput (opens new window) 属性来设置音频输出的设备。

/**
 * 设置默认音频输出设备,可以在业务进行前设置
 */
public abstract void setDefaultAudioOutput(JRTCMediaDeviceAudio audioOutput);

# 音频输出设备变化回调

您可以通过实现 onAudioOutputDeviceChanged (opens new window) 接口监听。

/**
 * 当前音频输出设备切换回调
 *
 * @param audioOutput 音频输出设备
 */
void onAudioOutputDeviceChanged(JRTCMediaDeviceAudio audioOutput);

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

在通话中调用 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();

# 获取扬声器音量级别

打开音频输出后就可以实时调用 getSpkLevel (opens new window) 接口获取当前的扬声器的音量级别,上层可根据数值进行展示和调整,与通话状态无关。

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

示例代码:

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

# 操作 loopback 采集

调用 enableLoopback (opens new window) 接口,使用设备的系统声音作为通话内音频输入。使用场景:通话一端给另一端分享本地系统音频。

/**
 * 开启/关闭 loopback 音频采集
 *
 * @param enable 开启/关闭
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean enableLoopback(boolean enable)

# 检测音频设备是否正常

调用 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);

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

enableMicAgc (opens new window)开启或关闭本地麦克风的增益(软件增益),默认开启。

if (room.enableMicAgc(!micAgc)) {
    micAgc = !micAgc;
    String txt = micAgc ? "关闭麦克风增益" : "开启麦克风增益";
    // ......
} else {
    JOptionPane.showMessageDialog(null, mMicAgc ? "关闭失败" : "开启失败", null, JOptionPane.ERROR_MESSAGE);
}

# 本地文件音频源输入完成回调

本地文件音频源输入完成回调onFileAudioInputDidFinish (opens new window)

@Override
public void onFileAudioInputDidFinish() {

}

# 2. 视频设备管理

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

# 获取摄像头列表

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

示例代码:

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

# 获取当前已经开启摄像头列表

/**
 * 获取当前打开的摄像头列表
 *
 * @return 当前打开的摄像头列表
 */
public abstract List<JRTCMediaDeviceCamera> getOpenedCameras();

# 摄像头采集属性

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

/**
 * 设定摄像头分辨率
 * <p>
 * 在调用 {@link #startCamera} 接口开启摄像头前设置即可生效
 *
 * @param width     采集宽度,默认640
 * @param height    采集高度,默认360
 * @param frameRate 采集帧速率,默认24
 */
public abstract void setCameraProperty(int width, int height, int frameRate);

示例代码:

mediaDevice.setCameraProperty(640, 360, 24);

# 打开/关闭摄像头

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

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

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

/**
 * 关闭当前打开的所有摄像头
 *
 * @return 调用是否成功
 * - true:正常执行调用流程,存在以下两种场景:
 * - 若调用此方法前摄像头已打开,会收到 {@link JRTCMediaDeviceCallback#onCameraUpdate onCameraUpdate} 回调
 * - 若调用此方法前摄像头未打开,不会收到通知
 * - false:调用失败
 */
public abstract boolean stopAllCameras();

示例代码:

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

# 是否有摄像头打开

/**
 * 是否有摄像头打开
 */
public abstract boolean isCameraOpen();

# 切换摄像头

/**
 * 切换摄像头
 * <p>
 * - 调用此方法时要保证摄像头已打开,否则将直接返回 false
 * - 设备拥有两个以上摄像头,否则将直接返回 false
 *
 * @return 接口调用结果
 * - true: 接口调用成功
 * - false: 接口调用异常
 */
public abstract boolean switchCamera(JRTCMediaDeviceCamera oldCamera, JRTCMediaDeviceCamera newCamera);

示例代码:

//摄像头0切换到摄像头1
mediaDevice.switchCamera(mediaDevice.getCameras().get(0), mediaDevice.getCameras().get(1)); 

# 摄像头变化回调

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

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

# 第三方网络摄像头

# 登录

loginIPCamera (opens new window)第三方网络摄像头登录,第三方网络摄像头登录参数JRTCIPCameraLoginParam (opens new window)

JRTCIPCameraLoginParam param = new JRTCIPCameraLoginParam();
/**
 * 设置网络摄像头得ip
 *
 * @param ip ip
 */
param.setIp(String ip);

/**
 * 第三方摄像头所使用端口
 *
 * @param port 端口号
 */
param.setPort(int port);

/**
 * 第三方摄像头登录用户名
 *
 * @param user 用户名
 */
param.setUser(String user);

/**
 * 第三方摄像头登录密码
 *
 * @param password 登录密码
 */
param.setPassword(String password);

/**
 * 标记摄像头厂商
 *
 * @param manufacturer 摄像头厂商
 *                   - {@link #@JRTCMediaDevice.MANUFACTURER_NONE MANUFACTURER_NONE} : 未获取到厂商
 *                   - {@link #@JRTCMediaDevice.MANUFACTURER_NORMAL MANUFACTURER_OTHER} : 普通摄像头/其他摄像头厂商
 *                   - {@link #@JRTCMediaDevice.MANUFACTURER_HIK MANUFACTURER_HIK} : 海康摄像头厂商
 */
param.setManufacturer(@JRTCMediaDevice.ManufacturerType int manufacturer);

厂商介绍ManufacturerType (opens new window)

/**
 * 未获取到厂商
 */
public static final int MANUFACTURER_NONE = 0;
/**
 * 通常摄像头
 */
public static final int MANUFACTURER_NORMAL = 1;
/**
 * 海康摄像头厂商
 */
public static final int MANUFACTURER_HIK = 2;
/**
 * 大华摄像头厂商
 */
public static final int MANUFACTURER_DAHUA = 3;

# 登出

logoutIPCamera (opens new window)第三方网络摄像头登出,登出第三方网络摄像头得参数对象JRTCIPCameraLogoutParam (opens new window)

JRTCIPCameraLogoutParam param = new JRTCIPCameraLogoutParam();
/**
 * 摄像头id
 *
 * @param cameraId 摄像头id
 */
param.setCameraId(String cameraId);

/**
 * 标记摄像头厂商
 *
 * @param manufacturer 摄像头厂商
 *                   - {@link #@JRTCMediaDevice.MANUFACTURER_NONE MANUFACTURER_NONE} : 未获取到厂商
 *                   - {@link #@JRTCMediaDevice.MANUFACTURER_NORMAL MANUFACTURER_OTHER} : 普通摄像头/其他摄像头厂商
 *                   - {@link #@JRTCMediaDevice.MANUFACTURER_HIK MANUFACTURER_HIK} : 海康摄像头厂商
 */
param.setManufacturer(@JRTCMediaDevice.ManufacturerType int manufacturer);

厂商介绍ManufacturerType (opens new window)

/**
 * 未获取到厂商
 */
public static final int MANUFACTURER_NONE = 0;
/**
 * 通常摄像头
 */
public static final int MANUFACTURER_NORMAL = 1;
/**
 * 海康摄像头厂商
 */
public static final int MANUFACTURER_HIK = 2;
/**
 * 大华摄像头厂商
 */
public static final int MANUFACTURER_DAHUA = 3;

# 状态变化通知

onIPCameraChange (opens new window)第三方网路摄像头状态变化通知

JRTCMediaDevice.JRTCMediaDeviceCamera camera 摄像头信息
int state 状态
- {@link JRTCMediaDevice#IP_CAMERA_CONNECTED IP_CAMERA_CONNECTED} : 1,已连接
- {@link JRTCMediaDevice#IP_CAMERA_DISCONNECTED IP_CAMERA_DISCONNECTED} : 2,已断开