融云 CDN
SDK 从 5.2.5 版本开始支持该功能。
当您使用 RTCLib SDK 做直播应用时,可以选用融云 CDN 服务分发直播媒体流。融云 CDN 服务能确保在不同区域、不同场景下加速直播内容的分发,提高资源访问速度。(注:下文中出现的内置 CDN
指的就是 融云 CDN
)
融云 CDN 服务架构
主播端用 RTC 协议发布音视频资源,资源由融云服务端接收,并转协议到 RTMP 并推给 CDN。视频编码协议为 h.264。
观众端可以感知到主播推流、服务端合流状态变化,无需 App Server 做过多的任务管理。观众端 App 可以调接口来选择订阅 CDN 链路或者 RTC 低延迟链路的直播流。
CDN 拉流时,默认按 CDN 服务输出的视频格式拉流,也可以调接口设置指定的拉流分辨率、码率、帧率( 说明:会触发 CDN 转码服务)。
服务架构图:
主要业务流程图:
服务开通与配置
融云 CDN 是付费增值服务,且需要开通后才能使用。详见 融云 CDN 服务配置。
启用内置 CDN
该步骤仅适用于控制台配置的 CDN 推流方式为手动 的场景。如果您在控制台配置的 CDN 推流方式为自动,所有直播房间的直播流都会自动推流到 CDN,观众可随时订阅,无需使用此接口启用内置 CDN。
如果控制台配置的 CDN 推流方式为手动,可在直播主播开始推流后,根据产品设计自行决定何时让融云服务开始或停止推流到 CDN。
如需启用内置 CDN,请在主播加入房间成 功,并且发布资源成功后,使用 RCRTCEngine
对象的 enableLiveMixInnerCdnStream
方法进行设置。该方法在整个直播过程中都可以操作开关。
enableLiveMixInnerCdnStream(enable: boolean): Promise<number>;
参数 | 类型 | 说明 |
---|---|---|
enable | boolean | 是否开启 |
该方法在整个直播过程中都可以操作开关。开启或关闭内置 CDN 时,观众均会收到对应回调。
-
开启内置 CDN 时:
房间中的观众会收到
RCRTCEngine
对象的setOnRemoteLiveMixInnerCdnStreamPublishedListener
回调。 -
关闭内置 CDN 时:
房间中观众会收到
RCRTCEngine
对象的setOnRemoteLiveMixInnerCdnStreamUnpublishedListener
回调。
代码示例:
rtcEngine?.enableLiveMixInnerCdnStream(enable);
获取房间内 CDN 资源
观众可在加入房间之前设置 setOnRemoteLiveMixInnerCdnStreamPublishedListener
回调,用于获取房间内 CDN 资源发布的事件。设置 setOnRemoteLiveMixInnerCdnStreamUnpublishedListener
回调,用于获取房间内 CDN 资源取消发布的事件。
rtcEngine?.setOnRemoteLiveMixInnerCdnStreamPublishedListener(() => {
console.log('房间内 CDN 资 源发布的事件')
});
rtcEngine?.setOnRemoteLiveMixInnerCdnStreamUnpublishedListener(() => {
console.log('房间内 CDN 资源取消发布的事件')
});
订阅 CDN 资源
观众可以调用 RCRTCEngine
对象的 subscribeLiveMixInnerCdnStream
方法订阅房间中的融云 CDN 资源。默认订阅 CDN 流的原始分辨率、帧率。
subscribeLiveMixInnerCdnStream(): Promise<number>;
订阅 CDN 资源的步骤如下:
-
创建一个 RCRTCView,并设置为视频流的预览窗口。
/// 创建预览窗口
<RCReactNativeRtcView
fitType={this.state.cdnFitType}
style={{ flex: 1 }}
ref={ref => {
this.rcLocaltag = findNodeHandle(ref);
}}
mirror={false}
/>
// 订阅 Cdn 流
let code = await rtcEngine?.subscribeLiveMixInnerCdnStream();
if (code != 0) {
return;
}
/// 设置视频流的预览窗口
rtcEngine?.setLiveMixInnerCdnStreamView(this.rcLocaltag!); -
( 可选)在调用订阅方法前,可以调用以下方法设置本次订阅的分辨率与帧率。订阅成功后,也可以使用以下方法切换分辨率与帧率。
setLocalLiveMixInnerCdnVideoResolution
:设置分辨率setLocalLiveMixInnerCdnVideoFps
:设置帧率
可通过
setOnLocalLiveMixInnerCdnVideoResolutionSetListener
和setOnLocalLiveMixInnerCdnVideoFpsSetListener
回调获取分辨率和帧率是否设置成功。 -
订阅融云 CDN 资源。如未主动设置本地订阅的分辨率或帧率,默认使用 CDN 流的原始分辨率、帧率。
/// 订阅融云 CDN 资源
rtcEngine?.subscribeLiveMixInnerCdnStream();
取消订阅
观众可以调用 RCRTCEngine
对象的 unsubscribeLiveMixInnerCdnStream
方法取消订阅融云 CDN 资源。
unsubscribeLiveMixInnerCdnStream(): Promise<number>;
示例代码:
rtcEngine?.unsubscribeLiveMixInnerCdnStream();
动态切换分辨率和帧率
观众订阅融云 CDN 资源成功后,调用 RCRTCEngine
对象的 setLocalLiveMixInnerCdnVideoResolution
方法切换需要观看的分辨率,调用 setLocalLiveMixInnerCdnVideoFps
方法切换需要观看的帧率。
/**
* 下面两个方法有两个不同的调用时机如下:
* 1. 当没有调用 subscribeLiveMixInnerCdnStream 订阅融云 CDN 流时,订阅前指定观看的分辨率、帧率。
* 2. 已经调用 subscribeLiveMixInnerCdnStream 订阅融云 CDN 流后,切换已经订阅的融云 CDN 视频流的分辨率、帧率。
*/
setLocalLiveMixInnerCdnVideoResolution(width: number, height: number): Promise<number>;
setLocalLiveMixInnerCdnVideoFps(fps: RCRTCVideoFps): Promise<number>
代码示例:
/// 设置观看 CDN 视频流的分辨率
rtcEngine?.setLocalLiveMixInnerCdnVideoResolution(720, 1280);
/// 设置观看 CDN 视频流的帧率
rtcEngine?.setLocalLiveMixInnerCdnVideoFps(RCRTCVideoFps.FPS_15);
设置 CDN 流禁用状态
观众订阅融云 CDN 流成功后,调用 RCRTCEngine
对象的 muteLiveMixInnerCdnStream
方法禁用或启用 CDN
流渲染。
muteLiveMixInnerCdnStream(mute: boolean): Promise<number>;
参数 | 类型 | 说明 |
---|---|---|
mute | boolean | true :停止资源渲染;false :恢复资源渲染 |
代码示例:
rtcEngine?.muteLiveMixInnerCdnStream(true);