跳到主要内容

融云 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 服务架构图(height=500)

主要业务流程图

融云内置 CDN 业务流程图(height=500)

服务开通与配置

融云 CDN 是付费增值服务,且需要开通后才能使用。详见 融云 CDN 服务配置

启用内置 CDN

提示

该步骤仅适用于控制台配置的 CDN 推流方式手动 的场景。如果您在控制台配置的 CDN 推流方式自动,所有直播房间的直播流都会自动推流到 CDN,观众可随时订阅,无需使用此接口启用内置 CDN。

如果控制台配置的 CDN 推流方式手动,可在直播主播开始推流后,根据产品设计自行决定何时让融云服务开始或停止推流到 CDN。

如需启用内置 CDN,请在主播加入房间成功,并且发布资源成功后,使用 RCRTCEngine 对象的 enableLiveMixInnerCdnStream 方法进行设置。该方法在整个直播过程中都可以操作开关。

enableLiveMixInnerCdnStream(enable: boolean): Promise<number>;
参数类型说明
enableboolean是否开启

该方法在整个直播过程中都可以操作开关。开启或关闭内置 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 资源的步骤如下:

  1. 创建一个 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!);
  2. (可选)在调用订阅方法前,可以调用以下方法设置本次订阅的分辨率与帧率。订阅成功后,也可以使用以下方法切换分辨率与帧率。

    • setLocalLiveMixInnerCdnVideoResolution:设置分辨率
    • setLocalLiveMixInnerCdnVideoFps:设置帧率

    可通过 setOnLocalLiveMixInnerCdnVideoResolutionSetListenersetOnLocalLiveMixInnerCdnVideoFpsSetListener 回调获取分辨率和帧率是否设置成功。

  3. 订阅融云 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>;
参数类型说明
mutebooleantrue:停止资源渲染;false:恢复资源渲染

代码示例:

rtcEngine?.muteLiveMixInnerCdnStream(true);