媒体参数设置
参数设置方法
发起通话前可以根据设备类型选择不同的媒体参数配置模式,从而达到优质的音视频通话效果。
菊风提供不同的媒体配置模式供开发者根据不同的场景选择,同时开放媒体设置参数供开发者灵活设置。具体如下:
// 360P
public static final int MODE_360P = 0;
// 720P
public static final int MODE_720P = MODE_360P + 1;
// 小屏智能设备
public static final int MODE_INTELLINGENT_HARDWARE_SMALL = MODE_720P + 1;
// 大屏智能设备
public static final int MODE_INTELLINGENT_HARDWARE_LARGE = MODE_INTELLINGENT_HARDWARE_SMALL + 1;
手机端通话任选其一;
智能硬件通话,小屏智能硬件设备一般选择 MODE_INTELLINGENT_HARDWARE_SMALL 模式,大屏智能硬件设备一般选择 MODE_INTELLINGENT_HARDWARE_LARGE 模式。
调用 generateByMode 选择模式,返回值是媒体配置参数:
/**
  * 根据模式生成配置参数
  * @param mode
  * @return
  */
public static MediaConfig generateByMode(@Mode int mode);
生成配置参数后调用 JCCall 中的 updateMediaConfig 方法更新媒体参数
JCCall.MediaConfig mediaConfig = JCCall.MediaConfig.generateByMode(JCCall.MediaConfig.MODE_INTELLINGENT_HARDWARE_SMALL);
JCManager.getInstance().call.updateMediaConfig(mediaConfig);
参数详情
1、MODE_360P 模式的参数
| 参数 | 描述 | 
|---|---|
| audioEnableCodecs | AMR | 
| audioAecMode | AEC_MODE_SDE | 
| audioArsEnable | 开启 | 
| audioArsBitrateMin | 20 | 
| audioArsBitrateMax | 75 | 
| audioRed | 开启 | 
| audioRxAnr | 关闭 | 
| audioRtx | 关闭 | 
| audioRxAgc | 关闭 | 
| audioQosAec | 开启 | 
| audioQosAnr | 开启 | 
| audioQosAgc | 开启 | 
| audioQosVad | 开启 | 
| videoEnableCodecs | H264-SVC;H264;VP8 | 
| videoResolutionRecvWidth | 640 | 
| videoResolutionRecvHeight | 360 | 
| videoResolutionSendWidth | 640 | 
| videoResolutionSendHeight | 360 | 
| videoBitrate | 800 | 
| videoSendFramerate | 24 | 
| videoArsEnable | 开启 | 
| videoArsBitrateMin | 50kpbs | 
| videoArsBitrateMax | 1500kbps | 
| videoArsFramerateMin | 1 | 
| videoArsFramerateMax | 10 | 
| videoRedFec | 开启 | 
| videoRecvFullScreen | 开启 | 
| videoSmallNalu | 开启 | 
| videoResolutionControl | 开启 | 
2、MODE_720P 模式的参数
| 参数 | 描述 | 
|---|---|
| audioAecMode | AEC_MODE_SDE | 
| audioArsEnable | 开启 | 
| audioArsBitrateMin | 20 | 
| audioArsBitrateMax | 75 | 
| audioRed | 开启 | 
| audioRxAnr | 关闭 | 
| audioRtx | 关闭 | 
| audioRxAgc | 关闭 | 
| audioQosAec | 开启 | 
| audioQosAnr | 开启 | 
| audioQosAgc | 开启 | 
| audioQosVad | 关闭 | 
| videoResolutionRecvWidth | 1280 | 
| videoResolutionRecvHeight | 720 | 
| videoResolutionSendWidth | 1280 | 
| videoResolutionSendHeight | 720 | 
| videoBitrate | 100 | 
| videoSendFramerate | 24 | 
| videoArsEnable | 开启 | 
| videoArsBitrateMin | 50kpbs | 
| videoArsBitrateMax | 1500kbps | 
| videoArsFramerateMin | 1 | 
| videoArsFramerateMax | 30 | 
| videoRedFec; | 开启 | 
| videoRecvFullScreen | 开启 | 
| videoSmallNalu | 开启 | 
| videoResolutionControl | 开启 | 
3、MODE_INTELLINGENT_HARDWARE_SMALL 模式参数
| 参数 | 描述 | 
|---|---|
| audioEnableCodecs | AMR | 
| audioAecMode | AEC_MODE_SDE | 
| audioArsEnable | 开启 | 
| audioArsBitrateMin | 2 | 
| audioArsBitrateMax | 12 | 
| audioRed | 关闭 | 
| audioRxAnr | 关闭 | 
| audioRtx | 关闭 | 
| audioRxAgc | 关闭 | 
| audioQosAec | 开启 | 
| audioQosAnr | 关闭 | 
| audioQosAgc | 开启 | 
| audioQosVad | 开启 | 
| videoEnableCodecs | H264-SVC;H264;VP8 | 
| videoResolutionRecvWidth; | 240 | 
| videoResolutionRecvHeight; | 240 | 
| videoResolutionSendWidth; | 352 | 
| videoResolutionSendHeight; | 288 | 
| videoBitrate | 50 | 
| videoSendFramerate | 10 | 
| videoArsEnable | 开启 | 
| videoArsBitrateMin | 视具体情况,手表以128*128 15帧 10kpbs | 
| videoArsBitrateMax | 200kpbs | 
| videoArsFramerateMin | 1 | 
| videoArsFramerateMax | 10 | 
| videoRedFec | 关闭 | 
| videoRecvFullScreen | 关闭 | 
| videoSmallNalu | 开启 | 
| videoResolutionControl | 关闭 | 
4、MODE_INTELLINGENT_HARDWARE_LARGE 模式参数
| 参数 | 描述 | 
|---|---|
| audioEnableCodecs | AMR | 
| audioAecMode | AEC_MODE_SDE | 
| audioArsEnable | 开启 | 
| audioArsBitrateMin | 2 | 
| audioArsBitrateMax | 12 | 
| audioRed | 关闭 | 
| audioRxAnr | 关闭 | 
| audioRtx | 关闭 | 
| audioRxAgc | 关闭 | 
| audioQosAec | 开启 | 
| audioQosAnr | 关闭 | 
| audioQosAgc | 开启 | 
| audioQosVad | 开启 | 
| videoEnableCodecs | H264-SVC;H264;VP8 | 
| videoResolutionRecvWidth; | 640 | 
| videoResolutionRecvHeight; | 340 | 
| videoResolutionSendWidth; | 640 | 
| videoResolutionSendHeight; | 360 | 
| videoBitrate | 50 | 
| videoSendFramerate | 10 | 
| videoArsEnable | 开启 | 
| videoArsBitrateMin | 视具体情况,手表以128*128 15帧 10kpbs | 
| videoArsBitrateMax | 2000kpbs | 
| videoArsFramerateMin | 1 | 
| videoArsFramerateMax | 10 | 
| videoRedFec | 关闭 | 
| videoRecvFullScreen | 开启 | 
| videoSmallNalu | 开启 | 
| videoResolutionControl | 关闭 | 
除了选择提供的模式外,开发者还可以根据对应的属性对媒体参数进行自定义的设置,以满足不同场景的需求。媒体参数包括音频和视频参数。具体说明如下:
音频参数
| 参数 | 类型 | 描述 | 
|---|---|---|
| audioEnableCodecs | NSString | 
 | 
| audioAecEnable | bool | 是否开启回声消除 | 
| audioAecMode | JCCallAecMode | 回声消除模式,具体参考AecMode枚举值 | 
| audioArsEnable | bool | 是否开启音频 ars | 
| audioArsBitrateMin | int | 音频最小码率,kb | 
| audioArsBitrateMax | int | 音频最大码率,kb | 
| audioRed | bool | 
 | 
| audioRxAnr | bool | 一般接收端声音质量好可关闭噪声抑制,减少声音dsp处理,降低功耗 | 
| audioRtx | bool | RTX重传, 同FEC、NACK一起用,降低功耗, 网络不稳定,一般选择打开 | 
| audioRxAgc | bool | 接收端声音自动增益控制, 接收端声音过大过小时,可尝试打开 | 
| audioQosAec | bool | 回声消除 | 
| audioQosAnr | bool | 
 | 
| audioQosAgc | bool | 发送端声音自动增益控制 | 
| audioQosVad | bool | 静音检测 | 
视频参数
| 参数 | 类型 | 描述 | 
|---|---|---|
| videoEnableCodecs | NSString | 
 | 
| videoResolutionRecvWidth | int | 视频接收宽 | 
| videoResolutionRecvHeight | int | 视频接收高 | 
| videoResolutionSendWidth | int | 视频发送宽 | 
| videoResolutionSendHeight | int | 视频发送高 | 
| videoBitrate | int | 
 | 
| videoSendFramerate | int | 发送帧率 | 
| videoArsEnable | bool | 是否开启视频 ars,即视频自动码率控制,开启之后可以保证编码码流的顺利传输和信道带宽的充分利用 | 
| videoArsBitrateMin | int | 视频最小码率,kb | 
| videoArsBitrateMax | int | 视频最大码率,kb | 
| videoArsFramerateMin | int | 视频最小帧率,kb | 
| videoArsFramerateMax | int | 视频最大帧率,kb | 
| videoRedFec | bool | 
 | 
| videoRecvFullScreen | bool | 影响本端视频请求分辨率,默认设置为true 
 | 
| videoSmallNalu | bool | 视频数据以SmallNalu方式打包, 一个包打包的数据多,减少包头的码率,从而降低功耗 | 
| videoResolutionControl | bool | 分辨率控制, 开启则分辨率随网络波动而变化, 关闭则固定分辨率 | 
其中,AecMode 有以下值:
// 声学回声消除。支持在免提状态下的通话,对于iOS和Windows等性能较好的机型有效。
public static final int AEC_MODE_AEC = MtcCallDb.EN_MTC_EC_AEC;
// 使用操作系统提供的声学回声消除功能,支持在免提状态下的通话。对于多数iOS和Android等品牌手机有效,但部分机型可能无效。
public static final int AEC_MODE_OS = MtcCallDb.EN_MTC_EC_OS;
// 声学回声抑制,通过半双工方式实现回声抑制,通常不建议使用。
public static final int AEC_MODE_AES = MtcCallDb.EN_MTC_EC_AES;
// 软件自适应声学回声消除,对于大多数所有机型有效。但计算量比AEC稍大一些。SDE追踪延迟精度高,FDE能适应更大的延迟。
public static final int AEC_MODE_FDE = MtcCallDb.EN_MTC_EC_AEC_FDE;
// 软件自适应声学回声消除,对于大多数所有机型有效。但计算量比AEC稍大一些。SDE追踪延迟精度高,FDE能适应更大的延迟。
public static final int AEC_MODE_SDE = MtcCallDb.EN_MTC_EC_AEC_SDE;
开发者可根据具体的需求自行配置。
示例代码:
//音频参数
JCCall.MediaConfig mediaConfig = JCCall.MediaConfig.generateByMode(JCCall.MediaConfig.MODE_INTELLINGENT_HARDWARE_LARGE);
mediaConfig.audioEnableCodecs = "opus";
mediaConfig.audioAecMode = JCCall.MediaConfig.AEC_MODE_FDE;
mediaConfig.audioArsEnable = true;
mediaConfig.audioArsBitrateMax = 20;
mediaConfig.audioArsBitrateMin = 5;
mediaConfig.audioRed = true;
mediaConfig.audioRxAnr = false;
mediaConfig.audioRtx = true;
mediaConfig.audioRxAgc = false;
mediaConfig.audioQosAec = true;
mediaConfig.audioQosAnr = true;
mediaConfig.audioQosAgc = true;
mediaConfig.audioQosVad = true;
//视频参数
mediaConfig.videoEnableCodecs = "H264";
mediaConfig.videoResolutionRecvWidth = 128;
mediaConfig.videoResolutionRecvHeight = 128;
mediaConfig.videoResolutionSendWidth = 640;
mediaConfig.videoResolutionSendHeight = 360;
mediaConfig.videoBitrate = 30;
mediaConfig.videoSendFramerate = 15;
mediaConfig.videoArsEnable = true;
mediaConfig.videoArsBitrateMax = 75;
mediaConfig.videoArsBitrateMin = 10;
mediaConfig.videoArsFramerateMax = 15;
mediaConfig.videoArsFramerateMin = 0;
mediaConfig.videoRedFec  = true;
mediaConfig.videoRecvFullScreen  = true;
mediaConfig.videoSmallNalu  = true;
mediaConfig.videoResolutionControl  = true;
JCManager.getInstance().call.updateMediaConfig(mediaConfig);
待机功耗优化方案
流程描述
- 手机呼叫手表,同时通过自身的推送通道下发通知到手表端。 
- 手表端收到通知后,初始化菊风模块并进行登录。 
- 登录成功后,等待服务器呼入。 
- 收到呼入并接听。 
- 通话结束。 
- 销毁菊风模块。 
1.手机端需要有超时机制来保证在对端收不到来电时能够及时挂掉。
2.手表端收到通知后去登录,登录成功后可能收不到来电,原因是手机端在手表尚未登录前就挂断,此时该通话已变为手表的未接来电,从而不会走呼入流程。
3.注册假 push 后,不需要调用 logout 进行登出,直接销毁菊风模块即可,否则 push 会无效。
被叫方
被叫方(手表)进行以下操作:
- 增加创建 JCPush 模块: - JCPush push = JCPush.create(client); 
- 登录成功后向服务器注册个假的push,主要是让服务器认为此用户不是离线状态,这样主叫呼叫就不会被服务器直接拒绝: - JCPushTemplate pushInfo = new JCPushTemplate(); pushInfo.initWithMiPush(context.getPackageName(), "随意输入"); JCManager.getInstance().push.addPushInfo(pushInfo); pushInfo.initWithCall(JCPushTemplate.XIAOMI, JCManager.getInstance().client.getUserId(), "呼叫", "0"); JCManager.getInstance().push.addPushInfo(pushInfo); //设置模式,登录成功后、呼叫前或者收到来电前都可以设置 JCManager.shared.call.mediaConfig = JCCall.MediaConfig.generateByMode(JCCall.MediaConfig.MODE_INTELLINGENT_HARDWARE_SMALL); 
- 手表收到厂家自身 push 后调起菊风模块进行初始化、登录等操作,登录成功后就会收到来电; 
- 通话结束后可以 destroy 菊风的模块。 
