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

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

发起通话前可以选择媒体配置模式,菊风提供如下三种模式供开发者选择

// 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 模式。

在发起通话前,开发者可以根据设备类型选择一种媒体配置模式并通过下面的接口生成配置参数

/**
  * 根据模式生成配置参数
  * @param mode
  * @return
  */
public static MediaConfig generateByMode(@Mode int mode);

生成配置参数后通过 JCCall 的 mediaConfig 属性进行设置

JCManager.shared.call.mediaConfig = JCCall.MediaConfig.generateByMode(JCCall.MediaConfig.MODE_INTELLINGENT_HARDWARE_SMALL);

其中,四种模式的媒体参数设置如下:

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;

开发者可根据具体的需求自行配置。

示例代码:

//音频参数
MediaConfig mediaConfig = new MediaConfig();
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.shared.call.mediaConfig = mediaConfig;

媒体参数设置之后,您可以开始 拨打通话 了。