媒体参数设置

参数设置方法

发起通话前可以根据设备类型选择不同的媒体参数配置模式,从而达到优质的音视频通话效果。

菊风提供不同的媒体配置模式供开发者根据不同的场景选择,同时开放媒体设置参数供开发者灵活设置。具体如下:

// 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

  • 音频编解码,具体有opus、PCMU、PCMA、G729、G722、AAC、AMR、AMR-WB、iLBC

  • 协商优先级按顺序排列, 每个编解码用”;”间隔, 注意大小写

audioAecEnable

bool

是否开启回声消除

audioAecMode

JCCallAecMode

回声消除模式,具体参考AecMode枚举值

audioArsEnable

bool

是否开启音频 ars

audioArsBitrateMin

int

音频最小码率,kb

audioArsBitrateMax

int

音频最大码率,kb

audioRed

bool

  • 语音red抗丢包, 打开会增加payload码率

  • 关闭增强抗丢包能力节省码率,从而降低功耗

  • 网络不稳定,一般选择打开

audioRxAnr

bool

一般接收端声音质量好可关闭噪声抑制,减少声音dsp处理,降低功耗

audioRtx

bool

RTX重传, 同FEC、NACK一起用,降低功耗, 网络不稳定,一般选择打开

audioRxAgc

bool

接收端声音自动增益控制, 接收端声音过大过小时,可尝试打开

audioQosAec

bool

回声消除

audioQosAnr

bool

  • 发送端噪声抑制, 接收端声音噪声大,提高抑制等级;

  • 接收端声音小,可在不影响声音质量情况下降低抑制等级或者关闭抑制

audioQosAgc

bool

发送端声音自动增益控制

audioQosVad

bool

静音检测

视频参数

参数

类型

描述

videoEnableCodecs

NSString

  • 视频编解码,具体有 H264-SVC、VP8、VP9、H264、H265、H263

  • 协商优先级按顺序排列

videoResolutionRecvWidth

int

视频接收宽

videoResolutionRecvHeight

int

视频接收高

videoResolutionSendWidth

int

视频发送宽

videoResolutionSendHeight

int

视频发送高

videoBitrate

int

  • 视频初始码率 kb,初始码率影响视频开始的清晰度

  • 设置高些能更快到达所需码率,初始码率必须在ars范围内

  • 720p 的 ars 范围一般在 30kbps~4235.4kbps bitrate 之间;1080p 的 ars 范围一般在 30kbps~7471.8kbps bitrate 之间

videoSendFramerate

int

发送帧率

videoArsEnable

bool

是否开启视频 ars,即视频自动码率控制,开启之后可以保证编码码流的顺利传输和信道带宽的充分利用

videoArsBitrateMin

int

视频最小码率,kb

videoArsBitrateMax

int

视频最大码率,kb

videoArsFramerateMin

int

视频最小帧率,kb

videoArsFramerateMax

int

视频最大帧率,kb

videoRedFec

bool

  • 支持rfc 2198 语音fec-red,增强抗丢包能力,会增加一倍的payload码率,不会增加包头。

  • 比如Opus 55kbps增加一倍码率后,最终码率达到90kbps=55+35;

  • Opus 10kbps增加一倍码率后,最终码率达到16kbps=10+6。

videoRecvFullScreen

bool

影响本端视频请求分辨率,默认设置为true

假设条件
    1. 本端默认请求是640*360的分辨率

    1. 本端屏幕分辨率为360*360

  • true:请求分辨率则会被调整为360*360

  • false: 请求还是以640*360进行请求

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

待机功耗优化方案

前提条件

手表已经注册假 push。

流程描述

  1. 手机呼叫手表,同时通过自身的推送通道下发通知到手表端。

  2. 手表端收到通知后,初始化菊风模块并进行登录。

  3. 登录成功后,等待服务器呼入。

  4. 收到呼入并接听。

  5. 通话结束。

  6. 销毁菊风模块。

1.手机端需要有超时机制来保证在对端收不到来电时能够及时挂掉。

2.手表端收到通知后去登录,登录成功后可能收不到来电,原因是手机端在手表尚未登录前就挂断,此时该通话已变为手表的未接来电,从而不会走呼入流程。

3.注册假 push 后,不需要调用 logout 进行登出,直接销毁菊风模块即可,否则 push 会无效。

主叫方

  1. 调用菊风接口呼叫被叫方(手表);

  2. 手表厂商通过自己 push 唤起手表。

被叫方

被叫方(手表)进行以下操作:

  1. 增加创建 JCPush 模块:

    JCPush push = JCPush.create(client);
    
  2. 登录成功后向服务器注册个假的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);
    
  3. 手表收到厂家自身 push 后调起菊风模块进行初始化、登录等操作,登录成功后就会收到来电;

  4. 通话结束后可以 destroy 菊风的模块。