媒体参数设置
参数设置方法
发起通话前可以根据设备类型选择不同的媒体参数配置模式,从而达到优质的音视频通话效果。
菊风提供不同的媒体配置模式供开发者根据不同的场景选择,同时开放媒体设置参数供开发者灵活设置。具体如下:
// 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 菊风的模块。