跳到主要内容

融云 CDN 插件

融云 CDN 插件(RongRTCPlayer)直接在 RTC 房间内提供了 融云 CDN 服务的订阅、播放等处理逻辑,降低了 App 业务侧的接入成本。

提示

融云 CDN 插件(RongRTCPlayer) 从 5.3.0 版本开始提供 CDN 播放器组件 RCRTCMediaPlayer,可直接通过 CDN 地址播放 CDN 流、获取 SEI 数据、或直接获取音视频帧数据用于自行处理。详见 CDN 播放器

本文主要描述如何通过融云 CDN 插件(RongRTCPlayer)操作和使用 RTC 房间内的 CDN 资源。

集成融云 CDN 插件

融云 CDN 插件导入方法请参见导入 SDK

集成融云 CDN 插件后请注意导入头文件:

#import <RongRTCPlayer/RongRTCPlayer.h>`

推流到融云 CDN 服务

您可以通过融云 CDN 服务的配置,由融云服务端控制,将 RTC 房间的直播流转推到融云 CDN。融云 CDN 服务获取直播流后,RTC 房间内将会新增 CDN 流资源,观众可以直接订阅。App 需要根据业务要求指定推流时机:

  • 开播自动推流:所有直播房间的直播流都会自动推流到融云 CDN。观众可随时订阅。
  • 开播手动推流:App 需要在直播主播开始推流后,通过客户端接口 enableInnerCDN 控制是否推流到融云 CDN 服务。
提示

如果推拉流模式自行生成推拉流地址,融云服务端不负责将 RTC 房间的直播流转推到融云 CDN。您按照融云 CDN 服务的地址规则生成地址后,可通过客户端或服务端的旁路推流 API 将直播流传入融云 CDN 服务。

手动推流到融云 CDN

如果控制台推拉流模式开播手动推流,必须在 App 客户端自行决定是否推流到融云 CDN 服务。在整个直播过程中都可以操作开关。

主播在 RTC 房间中发布资源后(详见[发布资源]),通过回调中返回的 RCRTCLiveInfo 对象操作是否启用向融云 CDN 推流。

以发布默认音视频流为例:

[[RCRTCEngine sharedInstance].room.localUser publishDefaultLiveStreams:^(BOOL isSuccess, RCRTCCode desc, RCRTCLiveInfo * _Nullable liveInfo) {
// 可以通过拿到的liveInfo对象进行推流相关配置
}];

RCRTCLiveInfo 对象提供以下方法设置是否向融云 CDN 服务推流:

- (void)enableInnerCDN:(BOOL)enable
completion:(void (^) (BOOL isSuccess, RCRTCCode code))completion
参数类型说明
enableBOOL是否开启
completion(BOOL isSuccess, RCRTCCode code)完成回调
[self.liveInfo enableInnerCDN:enable
completion:^(BOOL isSuccess, RCRTCCode code) {
if (isSuccess) {
//TODO:
}
}];

开启或关闭内置 CDN 时,观众均会收到对应回调。

  • 开启内置 CDN 时:房间中的观众会收到 RCRTCRoomEventDelegatedidPublishCDNStream: 回调。
  • 关闭内置 CDN 时:房间中的观众会收到 RCRTCRoomEventDelegatedidUnpublishCDNStream: 回调。

获取房间内 CDN 资源

采用开播自动推流开播手动推流方式将直播流推到融云 CDN 服务后,RTC 房间内的观众可获取房间内的 CDN 资源。

观众可通过以下方式获取房间内 CDN 资源:

  • 加入房间时获取:观众加入房间时,如果房间中已经存在 RCRTCCDNInputStream 流,可使用加入房间成功后获取到的 RCRTCRoom 对象中 getCDNStream 方法获取。

  • 通过房间事件监听获取:已在房间内的观众可通过 RCRTCRoom 注册房间事件监听 RCRTCRoomEventDelegate 获取本房间中 RCRTCCDNInputStream 流的发布和取消发布回调事件。


    /*!
    远端CDN流发布资源通知

    @param stream 发布的CDN资源
    @discussion
    Added from 5.1.5

    @remarks 代理
    */
    - (void)didPublishCDNStream:(RCRTCCDNInputStream *)stream;

    /*!
    远端CDN流取消发布资源通知

    @param stream 取消发布的CDN资源
    @discussion
    Added from 5.1.5

    @remarks 代理
    */
    - (void)didUnpublishCDNStream:(RCRTCCDNInputStream *)stream;

订阅房间内 CDN 资源

观众可以调用 RCRTCLocalUser 类的 subscribeStream:tinyStreams:completion: 方法订阅房间中 RCRTCCDNInputStream 资源。默认订阅 RCRTCCDNInputStream 的原始分辨率、帧率,即 getHighestResolutiongetHighestFPS

- (void)subscribeStream:(NSArray <RCRTCInputStream *> *)avStreams
tinyStreams:(NSArray <RCRTCInputStream *> *)tinyStreams
completion:(nonnull RCRTCOperationCallback)completion;
参数类型说明
avStreamsNSArray <RCRTCInputStream *>房间内直播流。
tinyStreamsNSArray <RCRTCInputStream *>需要携带小流的流数组
completionRCRTCOperationCallback完成的回调

avStreams 参数中传入房间内的 CDN 流资源。tinyStreams 为订阅 RTC 直播小流时的参数,可不传。

if (self.room == nil) {
return;
}

RCRTCCDNInputStream *rtmpStream = [self.room getCDNStream];
if (!rtmpStream) {
return;
}

RCRTCRemoteVideoView *cdnVideoView = [[RCRTCRemoteVideoView alloc] initWithFrame:self.view.bounds];
[self.sView addSubview:cdnVideoView];

[rtmpStream setVideoView:cdnVideoView];

[self.room.localUser subscribeStream:@[rtmpStream]
tinyStreams:@[]
completion:^(BOOL isSuccess, RCRTCCode code) {
if (isSuccess) {
//TODO:
}
}];

取消订阅

观众可以调用 RCRTCLocalUser 类的 unsubscribeStream:completion: 方法取消订阅 RCRTCCDNInputStream 资源。

- (void)unsubscribeStream:(nonnull RCRTCInputStream *)stream
completion:(nonnull RCRTCOperationCallback)completion;
参数类型说明
streamRCRTCInputStream房间内的 CDN 流
completionRCRTCOperationCallback取消订阅的结果回调
if (!self.room) {
return;
}

RCRTCCDNInputStream *rtmpStream = [self.room getCDNStream];
if (!rtmpStream) {
return;
}

[self.room.localUser unsubscribeStream:rtmpStream
completion:^(BOOL isSuccess, RCRTCCode code) {
if (isSuccess) {
//TODO:
}
}];

调整订阅分辨率

观众可以在订阅房间内 CDN 资源前后调整分辨率和帧率。

提示

调用订阅方法前,订阅成功后,均可以通过 RCRTCCDNInputStreamsetVideoConfig:fpsValue:completion: 方法设置本次订阅资源的分辨率、帧率。

/*!
设置分辨率和帧率 订阅之前设置
@param videoSizePreset 分辨率
@param fps 帧率
*/
- (void)setVideoConfig:(RCRTCVideoSizePreset)videoSizePreset
        fpsValue:(RCRTCVideoFPS)fps
       completion:(RCRTCConfigCallback)completion;
参数类型说明
videoSizePresetRCRTCVideoSizePreset分辨率枚举
fpsRCRTCVideoFPS帧率枚举
completionRCRTCConfigCallback结果回调
if (!self.room) {
return;
}

RCRTCCDNInputStream *rtmpStream = [self.room getCDNStream];
if (!rtmpStream) {
return;
}

[rtmpStream setVideoConfig:RCRTCVideoSizePreset1920x1080
fpsValue:RCRTCVideoFPS30
completion:^(BOOL isSuccess, RCRTCCode code) {
@StrongObj(self);
if (isSuccess) {
//TODO
}
}];

观众端禁用 CDN 流渲染

观众成功订阅 RTC 房间内的 CDN 流后,可调用 CDN 流(RCRTCCDNInputStream)的 isMute 方法禁用或启用 CDN 流渲染。

@property (nonatomic, assign, readwrite) BOOL isMute;
参数类型说明
isMuteBOOLYES: 停止资源渲染,NO: 恢复资源渲染
if (!self.room) {
return;
}

RCRTCCDNInputStream *rtmpStream = [self.room getCDNStream];
if (!rtmpStream) {
return;
}

[rtmpStream setIsMute:YES];

监听房间内 CDN 流的 SEI

提示

SDK 从 5.3.0 版本开始支持监听和接收房间内 CDN 流的 SEI 数据。

观众在订阅 RCRTCCDNInputStream 前,实现 RCRTCCDNInputStreamDelegate 协议的 cdnStream:handleSEIData: 代理方法,并设置 RCRTCCDNInputStreamdelegate 代理,通过该协议方法监听 CDN 流的 SEI 数据。

@protocol RCRTCCDNInputStreamDelegate <NSObject>
/*!
SEI 数据监听回调

@param cdnStream 当前 cdn 流对象
@param data SEI 数据
@discussion
订阅 cdn 流成功后,通过 receiver 回调 cdn 流中包含 SEI 信息
回调的频次取决于 cdn 流的 SEI 帧数据间隔
*/
- (void)cdnStream:(RCRTCCDNInputStream *)cdnStream handleSEIData:(NSString *)data;

@end
参数类型说明
cdnStreamRCRTCCDNInputStream *当前订阅的 cdn 流对象
dataNSString *SEI 数据
if (!self.room) {
return;
}

RCRTCCDNInputStream *rtmpStream = [self.room getCDNStream];
//设置cdn流代理
rtmpStream.delegate = self;

#pragma mark - RCRTCCDNInputStreamDelegate
- (void)cdnStream:(RCRTCCDNInputStream *)cdnStream handleSEIData:(NSString *)data {
NSLog(@"cdn stream receive SEI:%@",data);
}