混流

混流转推CDN

1 功能简介

混流是指的将推到创世云服务上的多路RTC流通过混流服务器混成一路流。

转推CDN(Content Delivery Network)指的是将音视频流从创世云实时音视频云推送到CDN的过程。通过CDN进行更大规模的内容分发,用户可以直接通过URL拉流地址从网页或者第三方播放器进行观看。

混流转推CDN就是将多路混流后的一路流转推到CDN,观众可以通过URL拉流地址拉一路流就能观看多个互动画面。

1.1、混流转推CDN的优点

1、降低了开发实现上的复杂度;比如当有N个主播互动连麦,如果采用混流,观众端可以直接通过URL拉流地址播放一路流实现观看N个主播的画面,而不用同时拉N路视频流;

2、降低对设备的性能要求,减少设备性能开销和网络宽带的负担;如果N路连麦,观众拉N路流,并同时播放N路流,需要设备硬件上能支持同时播N路流。

3、对一个画面鉴黄就可覆盖多个画面,更便捷。

1.2、混流转推实现时机

开发者在拉流 / 推流成功后开始混流;比如 主播A 与 观众B 成功连麦后,成功拉取到 观众B 的画面时即开始混 主播A 的流和 观众B 的流;也可以根据需求,在其他合适时机进行混流。

1.3、混流转推CDN地址获取

创世云支持自有的CDN分发,如果应用需要支持大规模音视频流分发的请与创世云的技术人员进行沟通进行沟通配置即可。配置后会默认将实时音视频流转推到创世云自有CDN。技术人员会将CDN转推地址提供给开发人员,开发人员在混流接口中传入即可。

如果您的应用与第三方 CDN 有业务合作,想要使用原有的第三方 CDN 流媒体网络的分发服务的同时又想使用 SDK 进行低延迟连麦,也是支持的,只需要将您的第三方CDN 转推地址传入混流接口中即可,详细请参考以下文档。

2 使用步骤

2.1、初始化、登录房间、推流

详情请参考 1、初始化 --- 2、登陆房间 ---3、推流

2.2、设置混流转推配置

CCStreamMixConfig 是SDK中混流转推的配置对象,包括转推CDN的rtmp地址、混流ID、混流后的输出分辨率、混流视频帧率、混流码率、混流流信息列表,配置类详情见下图:

注意:必须传入正确的混流RTMP服务地址,混流rtmp地址内容请参考以下方法参数说明;目前混流转推地址的 URL 格式必须为 RTMP 格式:rtmp://xxxxxxxx。

@interface CCStreamMixConfig : NSObject

/*!
@brief 【必传】混流后输出的rtmp 完整地址:(一般是混流后输出的 rtmp 服务器地址 + 混流后输出的 rtmp 服务器端口号(默认1935) + 混流后输出的 rtmp 应用名)
*/
@property (nonatomic, strong) NSString *rtmpAddress;
/*!
@brief 【必传】混流后的流Id
*/
@property (nonatomic, strong) NSString *outputStremId;
/*!
 @brief 【必传】混流后的视频分辨率
 支持的分辨率:
 CC_MIX_OUTPUT_RESOLUTION_800X600(分辨率 800x600)、
 CC_MIX_OUTPUT_RESOLUTION_432X768(分辨率432x768)、
 CC_MIX_OUTPUT_RESOLUTION_768X432(分辨率 768x432)
 */
@property (nonatomic, assign) CC_MIX_OUTPUT_RESOLUTION  outputVideoResolution;
/*!
 @brief  【必传】混流后的视屏帧率,推荐值:15
 */
@property (nonatomic, assign) NSUInteger outputVideoFPS;
/*!
 @brief 【必传】 混流后的视频比特率(单位:kbps)
 */
@property (nonatomic, assign) NSUInteger outputVideoBitrate;
/*!
@brief 【必传】 参与混流的流信息列表
*/
@property (nonatomic, strong) NSMutableArray <CCStreamMixItemConfig *> *mixStreams;

@end

其中参与混流的流信息列表的元素类是布局配置类:CCStreamMixItemConfig,它的详细原型见以下:


 @interface CCStreamMixItemConfig : NSObject
 /*!
 @brief (混流信息)用户所推的原视频流的流Id
 */
 @property (nonatomic, strong) NSString * _Nonnull streamId;
 /*!
  @brief (混流信息)用户所推的视频流,混入之后期望所在的位置和大小的坐标信息
  */
 @property (nonatomic, assign) CGRect mixDstRect;
 /*!
  @brief (混流信息)用户所推的视频流,混入之后期望的层叠顺序(0为最底层,一般发起混流的主播传0,之后依次向上层叠)
  */
 @property (nonatomic, assign) int mixZIndex;

 @end

2.3.1、构建混流配置和混流输入流列表布局配置

输入流最多可设 9 路流(其中必须包括发起混流者自己的流)。下面代码演示混两路流,一路是自己的,一路是房间内其他人的,左右布局。

- (CCStreamMixConfig *)mixConfig{

    CC_MIX_OUTPUT_RESOLUTION mixOutputResolutionType = CC_MIX_OUTPUT_RESOLUTION_432X768;
    if (mixOutputResolution.width == 800) {
        mixOutputResolutionType = CC_MIX_OUTPUT_RESOLUTION_800X600;
    }else if (mixOutputResolution.width == 768){
        mixOutputResolutionType = CC_MIX_OUTPUT_RESOLUTION_768X432;
    }
    CCStreamMixConfig *mixConfig = [[CCStreamMixConfig alloc] init];
    mixConfig.rtmpAddress = mixRtmpAddress;
    mixConfig.outputStremId = self.roomId;//[CYUserInfo sharedInstance].mixStreamId; 混流ID,此处为了方便测试传roomid
    mixConfig.outputVideoBitrate = mixBitrate;
    mixConfig.outputVideoFPS = 15;//默认15
    mixConfig.outputVideoResolution = CC_MIX_OUTPUT_RESOLUTION_768X432;//混流画布的宽高设置
    mixConfig.mixStreams = [self mixReactStreams];
    return mixConfig;
}

- (NSMutableArray <CCStreamMixItemConfig *>*)mixReactStreams{
    NSMutableArray *mixStreams = [[NSMutableArray alloc] init];
    //设置当前自己推流的混流配置
    CCStreamMixItemConfig *mainMixItemConfig = [[CCStreamMixItemConfig alloc] init];
    mainMixItemConfig.streamId = self.selfStreamInfo.streamId;
    mainMixItemConfig.mixZIndex = 0;//当前流传0
    __block CGFloat width = mixOutputResolution.width/2;//混流画布的宽度一半
    __block CGFloat height = mixOutputResolution.height;//混流画布高度
    mainMixItemConfig.mixDstRect = CGRectMake(0, 0,width,height);
    [mixStreams addObject:mainMixItemConfig];
    //设置房间除当前自己推流以外的其他流的混流配置(自定义坐标布局)
    CCStreamInfo *itemInfo = (CCStreamInfo *)localStreamsInfoArr[0];
    CCStreamMixItemConfig *mixItemConfig = [[CCStreamMixItemConfig alloc] init];
    mixItemConfig.streamId = itemInfo.streamId;
    mixItemConfig.mixZIndex = 1;
    mixItemConfig.mixDstRect = CGRectMake(width, 0, width,height);
    [mixStreams addObject:mixItemConfig];
    return mixStreams;
}

2.3、发起混流转推

// Objective-C

 [self.liveSDkManager startStreamMixWithConfig:self.mixConfig];

方法参数说明:

参数 类型 是否必传 描述
mixConfig CCStreamMixConfig 必传 混流配置,CCStreamMixConfig参数mixConfig详情看CCStreamMixConfig

2、更新混流布局

当已经开始混流,但是房间人信息有变动,此时只需要更新混流布局,不需要再次调用上面的开始混流接口。

// Objective-C

[self.liveSDkManager updateStreamMixWithConfig:self.mixConfig];

方法参数说明:

参数 类型 是否必传 描述
mixConfig CCStreamMixConfig 必传 混流配置,CCStreamMixConfig参数mixConfig详情看CCStreamMixConfig

3、停止混流

// Objective-C

 [self.mainManage stopStreamMix];

4、混流状态变更回调

// Objective-C

- (void)onMixStreamCallBack:(NSInteger)code{

}