cdn_plugin
融云 CDN 功能依赖
Player
插件。插件导 入方法请参见导入 SDK。
场景描述
当您使用 RTC SDK 做直播应用时,可以选择用 CDN 分发直播媒体流。在控制台开启 融云 CDN 服务并配置域名等信息后,观众端 APP 可以调接口来选择订阅 CDN 链路或者 RTC 低延迟链路的直播流。
使用 CDN 拉流时观众端默认按 CDN 服务输出的视频格式拉流,也可以调接口设置指定的拉流分辨率、码率、帧率( 说明:会触发 CDN 转码服务)。
需要说明的是主播端还是用 RTC 协议发布音视频资源,资源由融云 Server 来接收并转协议到 RTMP 并推给 CDN。此外观众端 SDK 可以感知到主播是否推流,服务端合流情况,无需 App Server 做过多的任务管理。
服务架构图:
主要业务流程图:
服务开通
融云 CDN 是付费增值服务,且需要开通后才能使用。欢迎访问官网 查看计费说明,或直接前往控制台 开通融云 CDN 服务。
服务配置入口在控制台 —— 服务管理 —— 音视频服务 —— 音视频直播 —— 融云 CDN
服务配置
开通服务后,可见以下配置页。
推流方式
自动(推荐):在后台配置后,所有直播房间的直播流都会自动推流到 CDN,观众可随时订阅。
手动:在直播主播开始推流后,您需要根据产品设计决定何时调接口让融云服务开始或停止推流到 CDN。
推拉流域名
推拉流域名都需要填写二级域名,请确保此域名没有在别的 APPKEY 下配置过。
域名是成对的,推流和拉流有绑定关系,新增和修改时需要一并修改。
您需要确保一级域名已 经备案过。如果因域名没有备案或涉及非法业务等原因导致推流或者拉流域名不可用,由此产生的任何后果由您自身承担。
域名配置 “已生效” 后,需要您公司开发或服务运维人员自己做 cname 配置。具体如何配置可以咨询域名供应商。
防盗链配置
防盗链配置是可选项。配置后会提升推拉流域名的安全。
开启后一定要配置推流和拉流地址有效期时间和加密 URL 的密文 KEY。
防盗链开启后,如果观众端遇到弱网( 融云 SDK 内部帮您在网络恢复后重新订阅成功 )会比没有防盗链多出一些恢复订阅时间。
- 在 20:00 至次日 2:00 进行的配置不会立即生效,会在 2 点后依次配置生效。在此时间段外进行配置会在 30 分钟后生效。
- 新配置生效后,原有的配置即刻作废。建议开发者避开业务高峰时段,并给还在使用老配置的房间用户发送提醒通知,重新订阅新地址。
- 如果您的业务里 CDN 链路上的观众会进行 分辨率切换,需要提工单告知我们具体涉及哪些视频分辨率、帧率、码率,我们会配置相应域名支持的转码模版。
主播
是否启用内置 CDN
如果您在控制台配置融云CDN 为手动模式,您可根据产品需求,设置是否启用内置 CDN。方法如下:
-
在主播加入房间成功后,使用发布资源方法
RCRTCLocalUser#publishDefaultLiveStreams(IRCRTCResultDataCallback<RCRTCLiveInfo> callBack)
返回的RCRTCLiveInfo
对象设置是否启用内置CDN
,该方法在整个直播过程中都可以操作开关。 -
开启或关闭内置 CDN 时,观众均会收到对应回调。
开启内置 CDN 时:
房间中的观众会收到 IRCRTCRoomEventsListener 中
onPublishCDNStream(RCRTCCDNInputStream stream)
回调。关闭内置 CDN 时:
房间中观众会收到 IRCRTCRoomEventsListener 中
onUnpublishCDNStream(RCRTCCDNInputStream stream)
回调。
void enableInnerCDN(boolean enable, IRCRTCResultCallback callBack);
参数说明:
参数 | 类型 | 说明 |
---|---|---|
enable | boolean | 是否开启 |
callBack | IRCRTCResultCallback | 完成回调 |
示例代码:
liveInfo.enableInnerCDN(enable, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode rtcErrorCode) {
}
});
观众
获取房间内 CDN 资源
-
房间中已经存在 RCRTCCDNInputStream 流时,观众使用加 入房间成功后获取到的 RCRTCRoom 对象中 getCDNStream 方法获取。
-
观众加入房间成功后。通过
RCRTCRoom
注册房间事件监听 IRCRTCRoomEventsListener 获取本房间中RCRTCCDNInputStream
流的发布和取消发布回调事件。
rcrtcRoom.registerRoomListener(new IRCRTCRoomEventsListener() {
/**
* Added from 5.1.5
*
* 直播 CDN 流资源发布
*/
@Override
public void onPublishCDNStream(RCRTCCDNInputStream stream) {
super.onPublishCDNStream(stream);
}
/**
* Added from 5.1.5
*
* 直播 CDN 流资源取消发布
*/
@Override
public void onUnpublishCDNStream(RCRTCCDNInputStream stream) {
super.onUnpublishCDNStream(stream);
}
});
订阅 CDN 资源
-
观众可以调用 RCRTCLocalUser 类的
subscribeStreams
方法订阅房间中 RCRTCCDNInputStream 资源。 -
默认订阅
RCRTCCDNInputStream
的原始分辨率、帧率,即 getHighestResolution 和 getHighestFPS。 -
调用订阅方法前可以通过方法
RCRTCCDNInputStream#setVideoConfig(RCRTCVideoResolution videoResolution, RCRTCVideoFps videoFps, IRCRTCResultCallback callback)
设置本次订阅资源的分辨率、帧率。设置成功后通过方法RCRTCCDNInputStream#getVideoResolution
和RCRTCCDNInputStream#getVideoFps
获取。当setVideoConfig
中分辨率、帧率参数传null
时,将会订阅本房间CDN
资源的原始分辨率、帧率资源。
void subscribeStreams(List<? extends RCRTCInputStream> streams, IRCRTCResultCallback callBack);
参数说明:
参数 | 类型 | 说明 |
---|---|---|
streams | List<? extends RCRTCInputStream> | 音视频流集合 |
callBack | IRCRTCResultCallback | 订阅结果回调 |
示例代码:
RCRTCCDNInputStream inputStream = mRtcRoom.getCDNStream();
if (mRtcRoom == null || inputStream == null) {
// 没有加入房间 或 房间中没有 RCRTCCDNInputStream 流
return;
}
RCRTCVideoView videoView = new RCRTCVideoView(this);
// 设置视频流的渲染视图
inputStream.setVideoView(videoView);
// 显示流渲染视图
frameLayout.addView(videoView);
List<RCRTCInputStream> inputStreams = new ArrayList<>();
inputStreams.add(inputStream);
mRtcRoom.getLocalUser().subscribeStreams(inputStreams, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
取消订阅
观众可以调用 RCRTCLocalUser 类的 unsubscribeStreams()
方法取消订阅 RCRTCCDNInputStream
资源。
void unsubscribeStreams(List<? extends RCRTCInputStream> streams, IRCRTCResultCallback callBack);
参数说明:
参数 | 类型 | 说明 |
---|---|---|
streams | List<? extends RCRTCInputStream> | 取消订阅的音视频流集合, RCRTCInputStream |
callBack | IRCRTCResultCallback | 取消订阅的结果回调 |
示例代码:
RCRTCCDNInputStream inputStream = mRtcRoom.getCDNStream();
if (inputStream == null) {
// 房间中没有 RCRTCCDNInputStream 流,可能是主播没有发布
return;
}
List<RCRTCInputStream> inputStreams = new ArrayList<>();
inputStreams.add(inputStream);
mRtcRoom.getLocalUser().unsubscribeStreams(inputStreams, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(final RTCErrorCode rtcErrorCode) {
}
});
动态切换分辨率
观众订阅 RCRTCCDNInputStream
成功后,调用 RCRTCCDNInputStream
中如下方法可以切换需要观看的分辨率、帧率。
/**
* 该方法有两个功能如下:
* 1. 当没有订阅 RCRTCCDNInputStream 流时,订阅前指定的分辨率、帧率。
* 2. 已经订阅 RCRTCCDNInputStream 时调用,切换已经订阅 RCRTCCDNInputStream 的分辨率、帧率。
*
* @param videoResolution 默 认为null。为null时默认订阅原始 CDN 流分辨率
* @param videoFps 默认为null。为null时默认订阅原始 CDN 流帧率
*/
setVideoConfig(RCRTCVideoResolution videoResolution, RCRTCVideoFps videoFps, IRCRTCResultCallback callback)
参数说明:
参数 | 类型 | 说明 |
---|---|---|
videoResolution | RCRTCVideoResolution | 分辨率枚举 |
videoFps | RCRTCVideoFps | 帧率枚举 |
callBack | IRCRTCResultCallback | 结果回调 |
示例代码:
RCRTCVideoResolution videoResolution = RCRTCVideoResolution.RESOLUTION_720_1280;
RCRTCVideoFps videoFps = RCRTCVideoFps.Fps_15;
mRoom.getCDNStream().setVideoConfig(videoResolution, videoFps, new IRCRTCResultCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(RTCErrorCode errorCode) {
}
});
设置 CDN 流禁用状态
观众订阅 RCRTCCDNInputStream
成功后,调用 RCRTCCDNInputStream#mute(boolean mute);
方法禁用或启用CDN
流渲染。
void mute(boolean mute);
参数 | 类型 | 说明 |
---|---|---|
mute | boolean | true:停止资源渲染,false:恢复资源渲染 |
示例代码:
RCRTCCDNInputStream stream = mRoom.getCDNStream();
if (stream != null) {
stream.mute(true);
}