# 体验提升
# 1. 通话中质量检测
在通话场景中,开发者经常需要了解当前通话的通话质量、设备状态等信息,监测通话的整体体验;也可将部分质量数据在 UI 层面展示给用户,使用户能够及时了解当前通话的整体质量。
Juphoon RTC SDK 支持将关键的音视频状况、网络状况、设备状态的相关指标实时回调给 APP 应用层,应用层可以将收到的数据进行展示或统计。
# 网络质量检测
视频通话过程中,通话中成员的网络状态发生变化导致视频通话出现质量波动的时候,SDK 会通JRTCRoomCallback (opens new window) 的 onParticipantUpdate (opens new window) 回调进行上报。
/**
* 成员属性更新回调
*
* 当房间中有成员的属性发生变化时,房间中的其他成员会收到此回调,例如音频上传状态、视频上传状态、网络状态等发生变化。
* @param participant JRTCRoomParticipant 成员对象
* @param changeParam {@link JRTCRoomParticipant.ChangeParam} 更新标识类对象
* @param room 当前 JRTCRoom 对象
*/
void onParticipantUpdate(JRTCRoomParticipant participant, JRTCRoomParticipant.ChangeParam changeParam, JRTCRoom room);
示例代码:
public void onParticipantUpdate(JRTCRoomParticipant participant, ChangeParam changeParam, JRTCRoom room) {
if (changeParam.netStatus) {
switch (participant.getNetStatus()) {
case JRTCEnum.NET_STATUS_DISCONNECTED:
// 断开
break;
case JRTCEnum.NET_STATUS_VERY_BAD:
// 非常差
break;
case JRTCEnum.NET_STATUS_BAD:
// 差
break;
case JRTCEnum.NET_STATUS_NORMAL:
// 一般
break;
case JRTCEnum.NET_STATUS_GOOD:
// 好
break;
case JRTCEnum.NET_STATUS_VERY_GOOD:
// 非常好
break;
}
}
}
# 音频质量检测
视频通话过程中,通话中成员的说话声音状态发生变化,SDK 会通过 JRTCRoomCallback (opens new window) 的 onParticipantUpdate (opens new window) 回调进行上报。
示例代码:
@Override
public void OnParticipantUpdate(JCMediaChannelParticipant part, JCMediaChannelParticipant.ChangeParam param){
if (param.VolumeStatus){
switch (part.volumeStatus){
case JRTCEnum.VOLUME_STATUS_NONE:
/// 无声音 <30
break;
case JRTCEnum.VOLUME_STATUS_VERY_LOW:
/// 很低 30-40
break;
case JRTCEnum.VOLUME_STATUS_LOW:
/// 低 40-50
break;
case JRTCEnum.VOLUME_STATUS_MID:
/// 中 50-70
break;
case JRTCEnum.VOLUME_STATUS_HIGH:
/// 高 70-80
break;
case JRTCEnum.VOLUME_STATUS_VERY_HIGH:
/// 很高 >80
break;
}
}
}
# 剩余可用内存检测
加入房间后,JRTCMediaDeviceCallback (opens new window) 的 onMemoryAvailable (opens new window) 将定时上报系统中的内存剩余情况,检测系统的运行情况。
/**
* 上报剩余可用内存回调
* <p>
* 周期性上报一次内存剩余情况
*
* @param memorySize 当前剩余可用内存空间(MB)
*/
void onMemoryAvailable(double memorySize);
示例代码:
public void onMemoryAvailable(double memorySize) {
if (memorySize < 100) {
// 内存已严重不足,已不足100M,可能影响软件正常使用
} else if (memorySize < 200) {
// 剩余内存紧张,已不足200M
} else if (memorySize < 300) {
// 剩余内存低,已不足300M
} else {
return;
}
}
# 设置开启自适应回声消除
setAec (opens new window)设置开启自适应回声消除,需要在打开音频输入设备startAudioInput (opens new window)或者startAudio (opens new window)前调用才生效
mediaDevice.setAec(ture);
mediaDevice.setAec(false);
# 设置是否开启自动增益控制
setAgc (opens new window)设置是否开启自动增益控制,需要在打开音频输入设备startAudioInput (opens new window)或者startAudio (opens new window)前调用才生效
mediaDevice.setAgc(ture);
mediaDevice.setAgc(false);
# 2. 虚拟背景墙
通过虚拟背景墙统一座席视频背景画面,实现企业品牌形象与服务专业性的统一管理。
- 虚拟背景融合: 将实时视频通话中的背景替换为任意图片。
- 背景虚化: 将实时视频通话中的人像与背景分离,使背景虚化。
- UOS 暂不支持。
调用 enableVirtualBacklot (opens new window) 开启虚拟背景墙,在通话前,通话中均可使用。
/**
* 开启/关闭虚拟背景墙
*
* @param enable 是否开启虚拟背景墙
* @param imagePath 背景图片路径,当 enable 为 true 时有效
* @return 方法调用是否成功
*/
public abstract boolean enableVirtualBacklot(boolean enable, String imagePath);
示例代码:
// 开启虚拟背景墙
mediaDevice.enableVirtualBacklot(true, "path");
// 关闭虚拟背景墙
mediaDevice.enableVirtualBacklot(false, "");
# 3. 美颜设置
注:目前不支持 intel 集成显卡驱动,会出现Java崩溃或者设置不生效
# 打开/关闭美颜特效
通过调用 controlBeautyEffect (opens new window) 设置 JRTCBeautyEffectParam (opens new window) 参数设置本地成员的视频画面各特效参数,包括对比度,色相,饱和度,磨皮,滤镜,美白,红润。
打开美颜效果:在摄像头开启后设置参数即可生效
关闭美颜效果:在摄像头关闭前设置关闭即可生效
/**
* 开启/关闭摄像头美颜功能
*
* @param start 打开/关闭
* @param beautyEffectParam 美颜参数对象
* @return 打开/关闭美颜是否成功
*/
public abstract boolean controlBeautyEffect(boolean start, JRTCBeautyEffectParam beautyEffectParam);
获取当前的美颜设置参数:
/**
* 获取当前美颜设置参数
*
* @return
*/
public abstract JRTCBeautyEffectParam getBeautyEffectParam();
# 切换滤镜类型
打开美颜特效后,通过调用 controlBeautyFilter (opens new window) 设置滤镜效果参数后,可以进行滤镜类型的切换。
注:须先打开美颜设置,否则不生效;关闭美颜后失效。
/**
* 设置摄像头滤镜
*
* @param filterType 滤镜类型
* @return 设置滤镜是否成功
* @see BeautyFilterType
*/
public abstract boolean controlBeautyFilter(@BeautyFilterType int filterType);
滤镜类型,详见 BeautyFilterType (opens new window)
示例代码:
JRTCBeautyEffectParam param = new JRTCBeautyEffectParam();
param.setConstant(50);
param.setHue(40);
param.setSaturation(50);
param.setSmooth(20);
param.setFilter(80);
param.setWhiten(20);
param.setRedden(20);
//设置/更改美颜参数
mediaDevice.controlBeautyEffect(true,param);
//切换滤镜
mediaDevice.controlBeautyFilter(BEAUTY_FILTER_BLACK12);
//关闭美颜
mediaDevice.controlBeautyEffect(false, null);
# 其他媒体异常回调
通过 onEventHandler (opens new window) 监听其他媒体异常
/**
* 其他媒体事件回调
* @param eventId 查看ZMF类的相关事件定义
* @param json 查看ZMF类的相关定义
*/
void onEventHandler(String eventId, String json);
# 4. 文件上传
# 上传
文件上传要先调用 JRTCClient.getUploadUrl (opens new window) 获取上传的地址。
/**
* 获取文件上传路径
* <p>
* 调用此接口,fileId 非必须指定时可传空字符串 <br>
* 调用成功后,文件上传路径等具体信息可通过 {@link JRTCClientCallback#onGetUploadUrlResponse onGetUploadUrlResult} 回调获取 <br>
*
* @param fileId 文件id,
* @note 文件 id 用于断点续传,第二次续传文件时需要传递前一次获取到的 fileId
* 首次新文件上传,建议传空,fileId由服务器自动生成下发
* @return 接口调用结果
* - true: 接口调用成功
* - false: 接口调用异常
*/
public abstract boolean getUploadUrl(String fileId);
文件上传地址会在 JRTCClientCallback (opens new window) 中的 onGetUploadUrlResponse (opens new window) 中获得
/**
* 获取文件上传地址等信息回调
*
* 通话中访客可调用 {JRTCRoom#getUploadUrl getUploadUrl} 接口获取文件上传的地址等信息,具体信息通过此回调获取。
* @note
* 一般上传本地文件到服务器时,需要先调用 {JRTCRoom#getUploadUrl getUploadUrl} 接口,然后通过此回调的信息再上传至服务器。
* @param result 获取结果,true 表示获取成功,false 表示获取失败
* @param token 校验用的token
* @param url 文件上传地址
* @param fileId 文件id
* @param offset 文件续传位置
*/
void onGetUploadUrlResponse(boolean result, String token, String url, String fileId, long offset);
示例代码:
// 获取文件上传路径信息
client.getUploadUrl();
// 收到获取文件上传地址等信息回调
public void onGetUploadUrlResponse(boolean result, String token, String url, String fileId, long offset) {
// 获取到文件上传地址等信息后,上传文件至服务器
}
# 文件上传完成确认
可通过接口client.completeFileUpload (opens new window)确认文件上传是否完成,通过业务id去查询结果。除此之外有其他查询参数可设置JRTCCompleteFileUploadParam (opens new window),详解如下:
JRTCCompleteFileUploadParam param = new JRTCCompleteFileUploadParam();
/**
* 设置视频打点信息
*/
param.setVideoDotList(List<JRTCVideoDotParam> videoDotList);
/**
* 设置文件名
*/
param.setFileName(String fileName);
/**
* 设置开始时间戳
*
* @note 如果是录制文件场景,可以传录制开始时间戳
*/
param.setBeginTimestamp(long beginTimestamp);
/**
* 设置结束时间戳
*
* @note 如果是录制文件场景,可以传录制结束时间戳
*/
param.setEndTimestamp(long endTimestamp);
/**
* 设置文件大小,单位:B
*/
param.setFileSize(long fileSize);
/**
* 设置文件 md5 信息
*/
param.setFileMd5sum(String fileMd5sum);
/**
* 设置随路参数,具体和服务端约定
*/
param.setExtraInfo(Map<String, Object> extraInfo);
/**
* 设置存储配置id,具体和服务端约定
*/
param.setStorageId(String storageId);
/**
* 设置业务流水号,由业务集成方生成
*/
param.setBusinessId(String businessId);
/**
* 设置自定义文件类型
*
* @note 会通过 {@link JRTCClientCallback#onCompleteFileUploadResponse(int, boolean, String, String, String, String) onCompleteFileUploadResponse} 回调的 fileType 参数透传回来
*/
param.setFileType(String fileType);
/**
* 设置上传目标服务Oid
*/
param.setServerOid(String serverOid);
示例代码:
JRTCCompleteFileUploadParam param = new JRTCCompleteFileUploadParam();
param.setFileName(this.fileName);
param.setFileSize(file.length());
param.setFileMd5sum(hash);
param.setBusinessId(this.callId);
param.setBeginTimestamp(getFileTime(file));
param.setEndTimestamp(getFileTime(file));
param.setFileType("Image");
param.setServerOid(uploadServerOid);
param.setExtraInfo(extraInfo);
JRTCLog.info(FileManager.TAG, new JRTCLogParam.Builder(FileManager.DM)
.content("getMergedUploadFileInfo.JRTCRequestMergedFileUploadParam:%s ", param.toString())
.build());
int operatorId = BaseApplication.getManager().client.completeFileUpload(this.callId, param);
请求接口查询之后,可通过onCompleteFileUploadResponse (opens new window)上报得知,上报信息如下:
int operatorId 操作id,对应 {@link JRTCClient#completeFileUpload(String, JRTCCompleteFileUploadParam) completeFileUpload} 的返回值
boolean result 请求是否成功
- true: 请求成功
- false:请求失败
String fileName 服务器合并后的文件名
String extraInfo 随路参数
String fileType 文件类型
String reason 请求失败原因描述,当 result 为 false 时有效
示例代码:
@Override
public void onCompleteFileUploadResponse(int operatorId, boolean result, String fileName, String extraInfo, String fileType, String reason) {
if (TextUtils.equals(fileType, "Video")) {
// 视频
} else if (TextUtils.equals(fileType, "Image")) {
// 图片
}
}
# 获取文件上传或断点续传信息
上传完成后可通过接口requestFileUploadInfo (opens new window)获取文件上传或断点续传信息,,通过业务id去查询结果。除此之外有其他查询参数可设置JRTCRequestFileUploadParam (opens new window),详解如下:
JRTCRequestFileUploadParam param = new JRTCRequestFileUploadParam();
/**
* 设置文件名
*/
param.setFileName(String fileName);
/**
* 设置开始时间戳
* @note 可以传文件创建时的时间戳
*/
param.setBeginTimestamp(long beginTimestamp);
/**
* 设置待上传的文件大小,单位:B
*/
param.setFileSize(long fileSize);
/**
* 设置待上传文件 md5 信息
*/
param.setFileMd5sum(String fileMd5sum);
/**
* 设置自定义文件类型
* @note 会通过 {@link JRTCClientCallback#onRequestFileUploadInfoResponse(int, boolean, String, String, long, String, long, int, String, String, String) onRequestFileUploadInfoResponse} 回调的 fileType 参数透传回来
*/
param.setFileType(String fileType);
示例代码:
JRTCRequestFileUploadParam param = new JRTCRequestFileUploadParam();
param.setFileName(fileName);
param.setFileSize(file.length());
param.setFileMd5sum(FileUtils.getFileMd5Code(filePath));
param.setBeginTimestamp(getFileTime(file));
param.setFileType("Image");
JRTCLog.info(FileManager.TAG, new JRTCLogParam.Builder(FileManager.DM)
.content("getMergedUploadFileInfo.JRTCRequestMergedFileUploadParam:%s ", param.toString())
.build());
int operatorId = client.requestFileUploadInfo(callId, param);
调用成功后,少顷将会收到onRequestFileUploadInfoResponse (opens new window)通知,上报获取文件上传或断点续传信息。上报内容如下:
int operatorId 操作id,对应 {@link JRTCClient#requestFileUploadInfo(String, JRTCRequestFileUploadParam) requestFileUploadInfo} 的返回值
boolean result 请求是否成功
- true: 请求成功
- false:请求失败
String url 上传地址,分片录制文件上传场景,首次请求分片上传信息时有效
String token 文件上传所需token,用于校验上传合法性,需要在上传文件的时候携带
long requestTimestamp 本次请求发起时间戳,用于控制上传地址有效期,需要在上传文件的时候携带
String extraInfo 随路参数
long fileSize 文件大小
int offset 偏移量
String fileType 文件类型
String serverOid 上传目标服务Oid
String reason 请求失败原因描述,当 result 为 false 时有效
示例代码:
@Override
public void onCompleteFileUploadResponse(int operatorId, boolean result, String fileName, String extraInfo, String fileType, String reason) {
if (TextUtils.equals(fileType, "Video")) {
} else if (TextUtils.equals(fileType, "Image")) {
}
}
# 获取上传文件信息列表
上传完成后可通过接口getUploadFileInfo (opens new window)获取上传文件信息列表,通过业务id查询,可传递一些随路信息。
示例代码:
int operatorId = client.getUploadFileInfo(callId, map);
调用成功后会收到onGetUploadFileInfoResponse (opens new window)事件通知,通知内容为:
int operatorId 操作id,对应 {@link JRTCClient#getUploadFileInfo(String, Map) getUploadFileInfo} 的返回值
boolean result 请求是否成功
- true:请求成功
- false:请求失败
List<JRTCUploadFileInfo> uploadFileInfoList 文件信息对象列表,当 result 为 true 时有效
String extraInfo 随路参数,当 result 为 true 时有效
String reason 请求失败原因描述,当 result 为 false 时有效
示例代码:
@Override
public void onCompleteFileUploadResponse(int operatorId, boolean result, String fileName, String extraInfo, String fileType, String reason) {
if (TextUtils.equals(fileType, "Video")) {
} else if (TextUtils.equals(fileType, "Image")) {
}
}
# 5. 播放本地音频文件作为音频源输入
# 开始/结束
enableAudioInputFromFile (opens new window)开始/结束播放本地音频文件作为音频源输入,如果用户正在通话中,该音频将播放到通话内,通话中所有成员包括自己都能听到。可以设置是否循环播放。
guest.enableAudioInputFromFile(enable, filePath, loop);
# 暂停/继续
suspendAudioInputFromFile (opens new window)暂停/继续播放语音文件作为音频源输入
guest.suspendAudioInputFromFile(suspend);
# 6. 其他提升
# 天赛事件上报
onTessarEvent (opens new window)上报天赛事件码、事件其他信息。(包含警告和错误事件)
@Override
public void onTessarEvent(int eventCode, String extraInfo) {
}