ZEGO Express SDK 支持推流到 CDN(Content Delivery Network,内容分发网络),包括转推 CDN 和直推 CDN 两种功能。开发者基于该功能可打通 RTC 产品和 CDN 直播产品,方便用户从网页或第三方播放器直接观看和收听直播内容。为了保证安全,推流到 CDN 时默认开启 CDN 鉴权。
为防止攻击者盗取或伪造您的推流 URL 地址,您可以参考 CDN 推流鉴权,提升您推流使用的安全性。
在发起转推或直推 CDN 时需注意,CDN 对音视频格式有所要求,推流端音频支持 AAC 与 MP3,视频支持 H.264 与 H.265(需要 CDN 配置)。
转推 CDN 指的是将音视频流从 ZEGO 音视频云推送到 ZEGO 自有 CDN 或第三方 CDN 的过程。
转推 CDN 包括以下三种方式:
转推方式 | 说明 |
---|---|
默认转推 CDN |
用户使用 ZEGO Express SDK 推到 ZEGO 音视频云的直播流均会转推到 CDN,目前仅支持 ZEGO 自有 CDN。 |
旁路转推 CDN |
开发者自定义指定 ZEGO 实时音视频云上的流转推至 CDN,支持 ZEGO 自有 CDN 和第三方 CDN。 |
混流转推 CDN |
混流场景也可以将输出流转推至 CDN,支持 ZEGO 自有 CDN 和第三方 CDN。 |
直推 CDN 指的是将音视频流直接从本地客户端推送到 CDN 的过程,用户可直接通过拉流 URL 地址从网页或第三方播放器进行观看。但由于直推 CDN 功能在网络传输过程中不经过 ZEGO 实时音视频云,因此开发者无法使用 ZEGO 的实时音视频服务。
两种功能的说明与使用场景如下:
功能 | 说明 | 使用场景 |
---|---|---|
转推 CDN (推荐) |
推流先经过 ZEGO 实时音视频云,再由 ZEGO 实时音视频云转推向 CDN。可使用 ZEGO 提供的实时音视频服务,可用于需要连麦互动的场景。 |
开发者与第三方 CDN 有业务合作,想要使用原有的第三方 CDN 流媒体网络的分发服务的同时又想使用 ZEGO Express SDK 进行实时连麦互动。适用于有连麦互动要求的业务场景,例如秀场直播、语聊房等。 |
直推 CDN |
推流不经过 ZEGO 实时音视频云,直接推向 CDN。无法使用 ZEGO 提供的实时音视频服务,适用于单直播场景(无需互动)。 |
适用于开发者无需使用实时连麦互动等服务的情况,例如电商直播、游戏直播、大班课等。 |
在使用 CDN 直播之前,请确保:
CDN 直播功能不是默认开启的,使用前请在 ZEGO 控制台 自助开通(开通步骤请参考 项目管理 - 服务配置 中的“CDN”),或联系 ZEGO 技术支持开通。
若选择使用直推 CDN 功能,则无需执行本节所有步骤,请参考 直推 CDN。
请参考 快速开始 - 实现流程 的 “创建引擎”、“登录房间”、“推流”。
当推流成功后
,调用 addPublishCdnUrl 接口增加动态转推至 CDN 的 URL,即可将已经成功推向 ZEGO 实时云的音视频流动态向第三方 CDN 进行转推。
调用示例:
// 推流成功后,开始转推到 CDN
// 推流时使用的流 ID
std::string streamID = "STREAM_ID";
// 需要转推的 CDN 地址,请开发者按照实际 URL 填入,streamID 为推流的流名,可自定义
std::string URL = "rtmp://推流域名/接入点/streamID";
engine->addPublishCdnUrl(streamID, URL, [](int errorCode) {
if(errorCode == 0) {
// 转推成功
} else {
// 转推失败,可能由于网络原因转推请求发送失败
}
});
开发者可通过注册 onPublisherRelayCDNStateUpdate 获取添加/删除转推 CDN 地址状态回调。在 ZEGO RTC 服务器将音视频流转推到 CDN 后,如果 CDN 转推状态发生变化,例如出现转推停止或转推重试,将会收到此回调。
开发者可根据该回调判断转推 CDN 的音视频流是否正常:
调用示例:
class MyEventHandler:public IZegoEventHandler{
public:
void onPublisherRelayCDNStateUpdate(const std::string& /*streamID*/, const std::vector<ZegoStreamRelayCDNInfo>& /*streamInfoList*/) {
// 调用动态转推接口成功后,当 CDN 连接状态发生变更,如出现网络中断导致转推异常等情况,SDK 在重试转推的同时,会通过该回调通知
// 请注意,请勿在 SDK 回调线程中调用任何 SDK 接口,需要手动切换为其他线程,否则会产生死锁
}
};
auto handler=std::make_shared<MyEventHandler>();
engine->setEventHandler(handler);
调用 removePublishCdnUrl 即可删除动态转推至 CDN 的 URL。调用 removePublishCdnUrl 接口停止转推时,请确保当前流 streamID 是存在的。
调用示例:
// 停止推流前,先停止转推 CDN
// 推流时使用的流 ID
std::string streamID = "STREAM_ID";
// 需要停止转推的 CDN 地址,请开发者按照实际 URL 填入,streamID 为推流的流名
std::string URL = "rtmp://推流域名/接入点/streamID";
engine->removePublishCdnUrl(streamID, URL, [](int errorCode) {
if(errorCode == 0) {
// 停止转推成功
} else {
// 停止转推失败,可能由于网络原因停止转推请求发送失败
}
});
若选择使用转推 CDN 功能,则无需执行本节所有步骤,请参考 转推 CDN。
在推流前调用 enablePublishDirectToCDN 接口将音视频流直接推往 CDN。
ZegoCDNConfig config;
// URL 需要开发者根据实际情况填写,streamID 为推流的流名,可自定义
config.url = "rtmp://推流域名/接入点/streamID";
engine->enablePublishDirectToCDN(true, &config);
engine->startPublishingStream("STREAM_ID");
若需停止直推 CDN,调用 stopPublishingStream 接口停止推流即可。
停止推流后,若下一次推流无需直推 CDN,则可以调用 enablePublishDirectToCDN 接口并传值为 “false” 关闭直推 CDN 功能。在推流途中调用此接口不会影响此次推流。
engine->stopPublishingStream();
ZegoCDNConfig cdnConfig;
engine->enablePublishDirectToCDN(false, &cdnConfig);
当推流方直推 CDN 时,拉流方可以直接通过 streamID 进行拉流,请参考 快速开始 - 实现流程 的 “拉流”。
当音视频流转推 CDN 成功后,开发者希望用户从 CDN 进行拉流时,需要使用传入 URL 的自定义拉流方式进行拉流,而不能通过流 ID 进行拉流。URL 拉流的操作步骤可参考 通过 URL 拉流 中的 “1 配置拉流参数” 和 “2 开始拉流”。
联系我们
文档反馈