混流

混流是指的将推到创世云服务上的多路RTC流通过混流服务器混成一路流。观看者可以通过VLC播放器播放混流地址,也可以直接播RTC混流。此节重点介绍转推CDN的混流实现。

混流转推CDN

1 功能简介

转推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 混流流程

本节介绍如何使用ChuangRtcKit SDK实现混流转推RTMP功能,API调用时序图如下:

混流图

3 使用步骤

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

  • 注意:

  • 混流转推前提必须登录成功并发起推流成功,即混流发起者必须参与混流。

  • 支持房间内混流,跨房间混流,即将其他房间的流混入。

  • 混流接口配置中的rtmp地址必须设置且必须是rtmp协议的地址。

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

3.2 开始混流

3.2.1 设置混流转推配置

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

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

@interface ChuangMixStreamConfig : NSObject

/*!
 @brief 【必传】混流地址
 */
@property (nonatomic, copy) NSString *target;
/*!
 @brief 【必传】混流宽
 */
@property (nonatomic, assign) int width;
/*!
 @brief 【必传】混流高
 */
@property (nonatomic, assign) int height;
/*!
 @brief 【必传】 混流后的视频比特率(单位:kbps)
 */
@property (nonatomic, assign) int videoBitrateKbps;
/*!
 @brief 背景图
 */
@property (nonatomic, copy) NSString *backgroundImage;
/*!
 @brief 是否通知房间内其他用户此房间内存在一个混流
 */
@property (nonatomic, assign) BOOL noticeStream;
/*!
 @brief 混流水印
 */
@property (nonatomic, strong) ChuangMixStreamWatermark *mixStreamWatermark;

/*!
@brief 【必传】 参与混流的流信息列表  详情参照ChuangMixStreamInfo
*/
@property (nonatomic, strong) NSMutableArray <ChuangMixStreamInfo *> *mixStreams;

@end

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


@interface ChuangMixStreamInfo : NSObject
/*!
@brief (混流信息)用户所推的原视频流的流Id
*/
@property (nonatomic, copy) NSString *streamId;
/*!
 @brief 混流宽
 */
@property (nonatomic, assign) int width;
/*!
 @brief 混流高
 */
@property (nonatomic, assign) int height;
/*!
 @brief 图层
 */
@property (nonatomic, assign) int zlevel;
/*!
 @brief 目标rect
 */
@property (nonatomic, assign) CGRect dstRect;
/*!
 @brief 视频显示模式
 */
@property (nonatomic, assign) ChuangVideoRenderMode renderMode;
/*!
 @brief 视频流方向
 */
@property (nonatomic, assign) ChuangStreamRotation rotation;

@end

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

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

- (ChuangMixStreamConfig *)mixConfig{


    ChuangMixStreamConfig *mixConfig = [[ChuangMixStreamConfig alloc] init];
    mixConfig.target = mixRtmpAddress;
    mixConfig.videoBitrateKbps = mixBitrate;
    mixConfig.height = height;
    mixConfig.width = width;
    mixConfig.mixStreams = [self mixReactStreams];
    return mixConfig;
}

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

3.2.3 发起混流转推

// Objective-C

 [self.liveEngine startMixStream:self.mixConfig];

方法参数说明:

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

当已经开始混流,但是房间流布局有变动,此时也需要再次调用开始混流接口更新房间混流布局的。

如果需要更换混流RTMP地址,需要先调用停止混流再调用开始混流。

3.3 停止混流

// Objective-C

 [self.liveEngine stopMixStream];

3.4 混流状态变更回调

// Objective-C

/*!
 @brief 混流结果回调
 @param code 异常码  0:混流成功 非0:开始混流失败
 */
- (void)onMixStreamResult:(int)code {

}

results matching ""

    No results matching ""