ZEGO uniapp实时音视频 SDK 支持将音视频流转推到 CDN(Content Delivery Network,内容分发网络),转推 CDN 指的是将音视频流从 ZEGO 音视频云推送到 ZEGO 自有 CDN 或第三方 CDN 的过程,适用于有连麦互动要求的业务场景,例如秀场直播、语聊房等。
开发者基于该功能可打通 RTC 产品和 CDN 直播产品,方便用户从网页或第三方播放器直接观看和收听直播内容。为了保证安全,推流到 CDN 时默认开启 CDN 鉴权。

为防止攻击者盗取或伪造您的推流 URL 地址,您可以使用 CDN 推流鉴权,提升您推流使用的安全性。
转推 CDN 包括以下三种方式:
- 默认转推 CDN
用户使用 ZEGO Express SDK 推流到 ZEGO 音视频云的直播流均会转推到 CDN,目前仅支持 ZEGO 自有 CDN。
- 旁路转推 CDN
开发者自定义指定 ZEGO 实时音视频云上的流转推至 CDN,支持 ZEGO 自有 CDN 和第三方 CDN。
- 混流转推 CDN
混流场景也可以将输出流转推至 CDN,支持ZEGO 自有 CDN 和第三方 CDN。
uniapp实现CDN直播前提条件
在进行通话质量监测之前,请确保:
uniapp实现CDN直播步骤
初始化和登录房间
先创建界面(如有可忽略)。
创建引擎
调用 createEngineWithProfile 接口,将申请到的 AppID 和 AppSign 传入参数 “appID” 和 “appSign”,创建引擎单例对象。
如果需要注册回调方法,开发者可根据实际需要,实现 ZegoEventListener 中的某些方法,创建引擎后可通过调用 on 接口设置回调。
// 导入
import ZegoExpressEngine from '@/components/zego-ZegoExpressUniApp-JS/lib/ZegoExpressEngine';
// 采用通用场景
const profile = {
appID : xxx,
// AppSign 仅满足简单的鉴权需求,如果需要升级为更加安全的鉴权方式,请参考[如何从 AppSign 鉴权升级为 Token 鉴权](https://doc-zh.zego.im/faq/token_upgrade?product=ExpressVideo&platform=all)
// AppSign 可通过[控制台](https://console.zego.im/dashboard)获取,格式为 @"39011cbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
appSign: '39011cbxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
scenario : 0
};
ZegoExpressEngine.createEngineWithProfile(profile)
登录房间
1. 登录
您可以调用 loginRoom 接口登录房间。如果房间不存在,调用该接口时会创建并登录此房间。
- roomID 和 user 的参数由您本地生成,但是需要满足以下条件:
- 同一个 AppID 内,需保证 “roomID” 全局唯一。
- 同一个 AppID 内,需保证 “userID” 全局唯一,建议开发者将 “userID” 与自己业务的账号系统进行关联。
let roomConfig = {};
// 只有传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才能收到 onRoomUserUpdate 回调。
roomConfig.isUserStatusNotify = true;
// 登录房间
// 开始登录房间
ZegoExpressEngine.instance().loginRoom('room1', {'userID': 'id1', 'userName': 'user1'}, roomConfig);
2. 监听登录房间后的事件回调
可根据实际应用需要,在登录房间后监听想要关注的事件通知,比如房间状态更新、用户状态更新、流状态更新等。
- roomStateUpdate:房间状态更新回调,登录房间后,当房间连接状态发生变更(如出现房间断开,登录认证失败等情况),SDK 会通过该回调通知。
- roomUserUpdate:用户状态更新回调,登录房间后,当房间内有用户新增或删除时,SDK 会通过该回调通知。 只有调用 loginRoom 接口登录房间时传入 ZegoRoomConfig 配置,且 “isUserStatusNotify” 参数取值为 “true” 时,用户才能收到 roomUserUpdate 回调。
- roomStreamUpdate:流状态更新回调,登录房间后,当房间内有用户新推送或删除音视频流时,SDK 会通过该回调通知。
// 以下为常用的房间相关回调
ZegoExpressEngine.instance().on('roomStateUpdate', (roomID, state, errorCode, extendedData) => {
// 房间状态更新回调,登录房间后,当房间连接状态发生变更(如出现房间断开,登录认证失败等情况),SDK会通过该回调通知
}); ;
ZegoExpressEngine.instance().on('roomUserUpdate', (roomID, updateType, userList) => {
// 用户状态更新,登录房间后,当房间内有用户新增或删除时,SDK会通过该回调通知
});
ZegoExpressEngine.instance().on('roomStreamUpdate', (roomID, updateType, streamList) => {
// 流状态更新,登录房间后,当房间内有用户新推送或删除音视频流时,SDK会通过该回调通知
});
开始推流
请参考文章 uniapp实现音视频通话教程 中的 6.2 推流功能,这里不做详细介绍。
开始转推
当推流成功后,调用 addPublishCdnUrl 接口增加动态转推至 CDN 的 URL,即可将已经成功推向 ZEGO 实时云的音视频流动态向第三方 CDN 进行转推。支持的转推地址格式为 “rtmp”。
/** 推流成功后,开始转推到CDN */
// 推流时使用的流ID
let streamID = "STREAM_ID";
// 需要转推的CDN地址,请开发者按照实际URL填入,streamID为推流的流名,可自定义
let URL = "rtmp://推流域名/接入点/streamID";
ZegoExpressEngine.instance().addPublishCdnUrl(streamID, URL).then((result) {
if(result.errorCode == 0) {
// 转推成功
} else {
// 转推失败,可能由于网络原因转推请求发送失败
}
});
停止转推
调用 removePublishCdnUrl 接口即可删除动态转推至 CDN 的 URL。调用 removePublishCdnUrl 接口停止转推时,请确保当前流 streamID 是存在的。
// 推流时使用的流ID
let streamID = "STREAM_ID";
// 需要停止转推的CDN地址,请开发者按照实际URL填入,streamID为推流的流名
let URL = "rtmp://推流域名/接入点/streamID";
ZegoExpressEngine.instance().removePublishCdnUrl(streamID, URL).then((result) {
if(result.errorCode == 0) {
// 停止转推成功
} else {
// 停止转推失败,可能由于网络原因停止转推请求发送失败
}
});
观众拉流
当音视频流转推 CDN 成功后,开发者希望用户从 CDN 进行拉流时,需要使用传入 URL 的自定义拉流方式进行拉流,而不能通过流 ID 进行拉流。URL 拉流的操作步骤可参考 推拉流进阶 – 通过 URL 拉流 中的 “4.1 配置推拉流参数” 和 “4.2 开始拉流”。
通过以上步骤即可在 uniapp 应用中实现CDN直播。如果操作中有其他问题,也可以联系我们👇

本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/yinshipin/26456.html