融云 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
参数 | 类型 | 说明 |
---|---|---|
enable | BOOL | 是否开启 |
completion | (BOOL isSuccess, RCRTCCode code) | 完成回调 |
[self.liveInfo enableInnerCDN:enable
completion:^(BOOL isSuccess, RCRTCCode code) {
if (isSuccess) {
//TODO:
}
}];
开启或关闭内置 CDN 时,观众均会收到对应回调。
- 开启内置 CDN 时:房间中的观众会收到 RCRTCRoomEventDelegate 中
didPublishCDNStream:
回调。 - 关闭内置 CDN 时:房间中的观众会收到 RCRTCRoomEventDelegate 中
didUnpublishCDNStream:
回调。
获取房间内 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
的原始分辨率、帧率,即 getHighestResolution 和 getHighestFPS。
- (void)subscribeStream:(NSArray <RCRTCInputStream *> *)avStreams
tinyStreams:(NSArray <RCRTCInputStream *> *)tinyStreams
completion:(nonnull RCRTCOperationCallback)completion;
参数 | 类型 | 说明 |
---|---|---|
avStreams | NSArray <RCRTCInputStream *> | 房间内直播流。 |
tinyStreams | NSArray <RCRTCInputStream *> | 需要携带小流的流数组 |
completion | RCRTCOperationCallback | 完成的回调 |
在 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;
参数 | 类型 | 说明 |
---|---|---|
stream | RCRTCInputStream | 房间内的 CDN 流 |
completion | RCRTCOperationCallback | 取消订阅的结果回调 |
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 资源前后调整分辨率和帧率 。
- 观众订阅房间内 默认订阅
RCRTCCDNInputStream
的原始分辨率、帧率,即 getHighestResolution 和 getHighestFPS。 - 调整分辨率和帧率会触发 CDN 转码服务,转码对计费有影响。详见音视频直播增值服务计费说明。
调用订阅方法前,订阅成功后,均可以通过 RCRTCCDNInputStream
中 setVideoConfig:fpsValue:completion: 方法设置本次订阅资源的分辨率、帧率。
/*!
设置分辨率和帧率 订阅之前设置
@param videoSizePreset 分辨率
@param fps 帧率
*/
- (void)setVideoConfig:(RCRTCVideoSizePreset)videoSizePreset
fpsValue:(RCRTCVideoFPS)fps
completion:(RCRTCConfigCallback)completion;
参数 | 类型 | 说明 |
---|---|---|
videoSizePreset | RCRTCVideoSizePreset | 分辨率枚举 |
fps | RCRTCVideoFPS | 帧率枚举 |
completion | RCRTCConfigCallback | 结果回调 |
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;
参数 | 类型 | 说明 |
---|---|---|
isMute | BOOL | YES: 停止资源渲染,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:
代理方法,并设置 RCRTCCDNInputStream
中 delegate
代理,通过该协议方法监听 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
参数 | 类型 | 说明 |
---|---|---|
cdnStream | RCRTCCDNInputStream * | 当前订阅的 cdn 流对象 |
data | NSString * | 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);
}