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

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

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

/// 360P
JCCallMediaConfigMode360P,
/// 720P
JCCallMediaConfigMode720P,
/// 智能硬件场景,比如会和手表通话等
JCCallMediaConfigModeIntelligentHardware,

其中,手机端可以选择三种模式中的一种,如果和智能硬件通话,则一般选择 JCCallMediaConfigModeIntelligentHardware 模式。

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

/// 根据模式生成配置参数
/// @param mode 模式
+(JCCallMediaConfig* __nonnull)generateByMode:(JCCallMediaConfigMode)mode;

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

JCManager.shared.call.mediaConfig = [JCCallMediaConfig generateByMode:JCCallMediaConfigModeIntelligentHardware];

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

1、JCCallMediaConfigMode360P 模式的参数

参数 描述
audioAecMode JCCallAecModeFDE
audioArsEnable 开启
audioArsBitrateMin 20
audioArsBitrateMax 76
audioRed 开启
audioRxAnr 关闭
audioRtx 开启
audioRxAgc 关闭
audioQosAec 开启
audioQosAnr 开启
audioQosAgc 开启
audioQosVad 开启
videoResolutionRecvWidth 640
videoResolutionRecvHeight 360
videoResolutionSendWidth 640
videoResolutionSendHeight 360
videoBitrate 100
videoSendFramerate 30
videoArsEnable 开启
videoArsBitrateMin 30kpbs
videoArsBitrateMax 800kbps
videoArsFramerateMin 0
videoArsFramerateMax 30
videoRedFec 开启
videoRecvFullScreen 开启
videoSmallNalu 开启
videoResolutionControl 开启

2、JCCallMediaConfigMode720P

参数 描述
audioAecMode JCCallAecModeFDE
audioArsEnable 开启
audioArsBitrateMin 20
audioArsBitrateMax 76
audioRed 开启
audioRxAnr 关闭
audioRtx 开启
audioRxAgc 关闭
audioQosAec 开启
audioQosAnr 开启
audioQosAgc 开启
audioQosVad 开启
videoResolutionRecvWidth 1280
videoResolutionRecvHeight 720
videoResolutionSendWidth 1280
videoResolutionSendHeight 720
videoBitrate 100
videoSendFramerate 30
videoArsEnable 开启
videoArsBitrateMin 30kpbs
videoArsBitrateMax 2100kbps
videoArsFramerateMin 0
videoArsFramerateMax 30
videoRedFec; 开启
videoRecvFullScreen 开启
videoSmallNalu 开启
videoResolutionControl 开启

3、JCCallMediaConfigModeIntelligentHardware

参数 描述
audioAecMode JCCallAecModeFDE
audioArsEnable 开启
audioArsBitrateMin 5
audioArsBitrateMax 20
audioRed 开启
audioRxAnr 关闭
audioRtx 开启
audioRxAgc 关闭
audioQosAec 开启
audioQosAnr 开启
audioQosAgc 开启
audioQosVad 开启
videoResolutionRecvWidth; 视具体情况,手表的话一般128*128
videoResolutionRecvHeight; 视具体情况,手表的话一般128*128
videoResolutionSendWidth; 视具体情况,手表的话一般640*360
videoResolutionSendHeight; 视具体情况,手表的话一般640*360
videoBitrate 30
videoSendFramerate 15
videoArsEnable 开启
videoArsBitrateMin 视具体情况,手表以128*128 15帧 10kpbs
videoArsBitrateMax 视具体情况,手表以128*128 15帧 75kpbs
videoArsFramerateMin 0
videoArsFramerateMax 15
videoRedFec 开启
videoRecvFullScreen 开启
videoSmallNalu 开启
videoResolutionControl 开启

除了选择菊风提供的媒体配置模式外,开发者还可以根据对应的属性对媒体参数进行自定义的设置,以满足不同场景的需求。媒体参数包括音频和视频参数。具体说明如下:

音频参数

参数 类型 描述
audioEnableCodecs NSString
  • 音频编解码,具体有opus、PCMU、PCMA、G729、G722、AAC、AMR、AMR-WB、iLBC
  • 协商优先级按顺序排列, 每个编解码用”;”间隔, 注意大小写
audioAecEnable bool 是否开启回声消除
audioAecMode JCCallAecMode 回声消除模式,具体参考JCCallAecMode枚举值
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 分辨率控制, 开启则分辨率随网络波动而变化, 关闭则固定分辨率

其中,JCCallAecMode 有以下值:

/// 声学回声消除。支持在免提状态下的通话,对于iOS和Windows等性能较好的机型有效。
JCCallAecModeAEC = 0, // MtcCallDb.EN_MTC_EC_AEC;
/// 使用操作系统提供的声学回声消除功能,支持在免提状态下的通话。对于多数iOS和Android等品牌手机有效,但部分机型可能无效。
JCCallAecModeOS = 1, // MtcCallDb.EN_MTC_EC_OS;
/// 声学回声抑制,通过半双工方式实现回声抑制,通常不建议使用。
JCCallAecModeAES = 2, // MtcCallDb.EN_MTC_EC_AES;
/// 软件自适应声学回声消除,对于大多数所有机型有效。但计算量比AEC稍大一些。SDE追踪延迟精度高,FDE能适应更大的延迟。
JCCallAecModeFDE = 3, // MtcCallDb.EN_MTC_EC_AEC_FDE;
/// 软件自适应声学回声消除,对于大多数所有机型有效。但计算量比AEC稍大一些。SDE追踪延迟精度高,FDE能适应更大的延迟。
JCCallAecModeSDE = 4, // MtcCallDb.EN_MTC_EC_AEC_SDE;

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

示例代码:

//音频参数
JCCallMediaConfig* mediaConfig = [JCCallMediaConfig new];
mediaConfig.audioEnableCodecs = @"opus";
mediaConfig.audioAecMode = JCCallAecModeFDE;
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;

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