实时音视频
  • iOS
  • Android
  • macOS
  • Windows
  • HarmonyOS
  • Linux
  • Web
  • 小程序
  • Flutter
  • Electron
  • Unreal Engine
  • Unity3D
  • uni-app
  • React Native : JavaScript
  • Cocos Creator
  • 产品简介
  • 下载
  • 快速开始
    • 跑通示例源码
    • 集成 SDK
    • 实现视频通话
    • 实时音视频 SDK 与实时语音 SDK 差异
  • 通信能力
  • 房间能力
  • 音频能力
  • 视频能力
  • 直播能力
  • 其他能力
  • 最佳实践
  • 客户端 API
  • 服务端 API
  • 常见错误码
  • 常见问题
  • 文档中心
  • 实时音视频
  • 直播能力
  • 通过 URL 拉流

通过 URL 拉流

更新时间:2024-03-26 11:28

功能简介

当推流端使用第三方推流工具(例如 OBS 软件、网络摄像头 IP Camera 等)将流推到 CDN 时,或通过 ZEGO SDK 转推 CDN 功能将音视频画面推送到第三方 CDN 上时,可直接传入 URL 地址进行拉流。

前提条件

在实现 URL 拉流功能之前,请确保:

  • 已联系 ZEGO 技术支持开通 URL 拉流功能。
  • 已将音视频流推送到 CDN,并知晓相应的 URL,详情请参考 使用 CDN 直播

使用步骤

1 配置拉流参数

直接通过 CDN 的 URL 地址拉流,需要使用 ZegoCDNConfig 对象来填入 URL 参数,如果对应的 CDN 配置了拉流鉴权,还需要通过 authParam 字段填入鉴权参数。

  • 鉴权参数,即 URL 的 “?” 之后的字符串(不包括 “?”)。例如从 CDN 拉流的 URL 为 “rtmp://xxxx.yyy.zzz?a=qqq&b=www” 时,则鉴权参数为 “a=qqq&b=www”。
  • 拉流 URL 的鉴权参数主要用于防盗链,具体鉴权规则请联系具体的 CDN 厂商或 ZEGO 技术支持咨询。若无鉴权参数,请忽略 “authParam” 字段。
// 设置 CDN 参数 
let config = new ZegoCDNConfig();
// URL 为 CDN 拉流地址
config.url = "rtmp://xxxxxxxx";
// 如果需要鉴权则要设置鉴权参数,如果不需要鉴权可以不设置(鉴权参数不能带"?"字符)
config.authParam = "xxx";

let playerConfig = { cdnConfig: config }

2 开始拉流

调用 startPlayingStream 接口开始拉流,拉流时如果出现错误,请参考 常见错误码 - 1004xxx 拉流相关的错误码

  • 通过 URL 拉流前,需保证已登录房间。
  • 通过 URL 拉流时,不能直接通过填入流 ID 进行拉流,实际拉流画面以 URL 为准。
  • 虽然此时流 ID 不能用于拉流,但 SDK 内部仍以流 ID 作为唯一标识,用于后续拉流相关回调中。因此流 ID 仍需要在整个 AppID 内全局唯一。
// 开始拉流
// 填写了 url 参数后,sdk 会从 url 拉取音视频流,但此时依然需要传递一个唯一的 streamID 到 SDK,SDK 内部会以该 streamID 标识这条流
ZegoExpressEngine.instance().startPlayingStream("STREAM_ID", playerConfig);

3 停止拉流

若要停止拉流,调用 stopPlayingStream 接口。

// 停止拉流时传递的是拉流时传入的 streamID
ZegoExpressEngine.instance().stopPlayingStream("STREAM_ID");

4 (可选)监听拉流相关事件通知

监听拉流相关事件通知

可以通过 playerStateUpdate 来监听从 CDN 拉流的结果。

如果不是使用 ZEGO SDK 进行推流,而是使用第三方推流工具直接进行推流、但是使用 ZEGO SDK 进行拉流,这种场景下推流方没有使用 ZEGO SDK 加入房间,拉流方默认收不到 roomStreamUpdate 的回调,可以使用 增加房间流删除房间流 的功能,让拉流端可以收到 roomStreamUpdate 的回调。

ZegoExpressEngine.instance().on("playerStateUpdate", (streamID, state, errorCode, extendedData) => {
    console.info(`playerStateUpdate:streamID:${streamID}, state:${state}, errorCode:${errorCode}, extendedData:${JSON.stringify(extendedData)}`);

    // 调用拉流接口成功后,当拉流器状态发生变更,如出现网络中断导致推流异常等情况,SDK在重试拉流的同时,会通过该回调通知 
    // 1. 当收到该回调通知且 state 为 Playing 时,表示拉流成功
    // 2. 当收到该回调通知且 state 为 PlayRequesting 时,表示可能是正在拉流或者由于网络中断等原因导致 SDK 正在重试拉流
    // 3. 当收到该回调通知且 state 为 NoPlay 时,表示拉流停止
    // 4. 通过URL拉流时,回调参数中的stream_id即为调用拉流API时的流ID,用于唯一标识当次拉流事件。
});
本篇目录