# 集成CDN推流

CDN 推流服务适用于各类音视频直播场景,如企业级音视频会议、赛事、游戏直播、在线教育、娱乐直播等。CDN 推流集成简单高效,开发者只需调用相关 API 即可将 CDN 推流无缝对接到自己的业务应用中。

# 准备工作

如果需要开启 CDN 推流,需要在创建会议之前设置 CDN 地址。

// 设置录制参数
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
...其他参数...
[dic setObject:@"推流地址" forKey:JCConferenceConfigCdn];
// 创建频道
[conference start:confNumber video:true config:dic];
// 或者首个成员加入频道不存在则创建
[dic setObject:@"1" forKey:JCConferenceConfigCreateAndJoin]; 创建设置 "1",不创建设置 "0",默认不创建
[conference join:confNumber video:true config:dic];

# 开启 CDN 推流

只有 CDN 当前状态为 CConferenceCdnState.CDN_STATE_READY 时才可以进行 CDN 推流。其中,CDN 推流状态有以下几种:

/// 无法进行Cdn推流
JCConferenceCdnStateNone,
/// 可以开启Cdn推流
JCConferenceCdnStateReady,
/// Cdn推流中
JCConferenceCdnStateRunning,

开启 CDN 推流调用如下接口:

/**
 *  @brief  开关CDN推流,内部根据状态决定是否开启
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
- (bool)enableCdn;

当会议中收到回调接口 onCommandReceivedResult (opens new window) 的回调并且 JCConferenceCommandInfo 参数的 type 属性值等于 JCConferenceCommandInfo.COMMANDINFO_DELIVERY_JOIN 后,表示 CDN 已开启。

onCommandReceivedResult (opens new window) 回调接口:

/**
* @brief 收到会议属性变化或会议其他通知
*
* @param type 消息类型
*
*/
- (void)onCommandReceivedResult:(JCConferenceCommandInfo *)commandInfo;

示例代码:

// 根据CDN推流状态判断是否开启推流
if (conference.cdnState == JCConferenceCdnState.JCConferenceCdnStateReady) {
    // 可以开启 CDN 推流
    [conference enableCdn];
}

//CDN开启后会收到onCommandReceivedResult回调
- (void)onCommandReceivedResult:(JCConferenceCommandInfo *)commandInfo {
    if(commandInfo.type == JCConferenceCommandInfoTypeDeliveryJoin){
        //执行推流成功后的操作
    }
}

# 关闭 CDN 推流

关闭 CDN 推流调用如下接口:

/**
 *  @brief  开关CDN推流,内部根据状态决定是否开启
 *  @return 返回 true 表示正常执行调用流程,false 表示调用异常
 */
- (bool)enableCdn;

当会议中收到回调接口 onCommandReceivedResult (opens new window) 的回调并且 JCConferenceCommandInfo 参数的 type 属性值等于JCConferenceCommandInfo.COMMANDINFO_DELIVERY_JOIN 后,表示 CDN 已关闭。

示例代码:

// 根据CDN推流状态判断是否关闭推流
if (conference.cdnState == JCConferenceCdnState.JCConferenceCdnStateRunning) {
    // 关闭 CDN 推流
    [conference enableCdn];
}

//CDN关闭后会收到onCommandReceivedResult回调
- (void)onCommandReceivedResult:(JCConferenceCommandInfo *)commandInfo {
    if(commandInfo.type == JCConferenceCommandInfoTypeDeliveryJoin){
        //执行关闭推流后的操作
    }
}