实时音视频
  • iOS : Objective-C
  • Android
  • macOS
  • Windows
  • HarmonyOS
  • Linux
  • Web
  • 小程序
  • Flutter
  • Electron
  • Unreal Engine
  • Unity3D
  • uni-app
  • React Native
  • Cocos Creator
  • 产品简介
  • 下载
  • 体验 App
  • 快速开始
    • 跑通示例源码
    • 集成 SDK
    • 实现视频通话
    • 场景化音视频配置
  • 通信能力
  • 房间能力
  • 音频能力
  • 视频能力
  • 直播能力
  • 其他能力
  • 最佳实践
  • 客户端 API
  • 服务端 API
  • 常见错误码
  • 常见问题
  • 文档中心
  • 实时音视频
  • 最佳实践
  • 从 CDN 拉流切换到连麦场景

从 CDN 拉流切换到连麦场景

更新时间:2024-04-02 15:28

功能简介

在连麦场景中,由于 CDN 拉流和 CDN 推流都有很高的延迟,会导致连麦过程互动体验很差,因此推荐在连麦过程中使用 RTC 拉流和 RTC 推流,麦下再恢复 CDN 拉流,以提升连麦体验。本文将介绍在完整的 CDN 地址拉流方式下,如何实现连麦过程。

拉流方式对比

拉流方式 适应场景 延迟情况
从 CDN 拉流
观众不需要与主播连麦,通过弹幕等方式与主播互动,对观看的实时性要求不高。
延迟超过 3 秒
从 RTC 拉流
观众需要与主播连麦,且与主播互动交流实时性要求较高。
连麦双方延迟低于 300 毫秒

前提条件

如需从 CDN 拉流切换到连麦场景,请确保当前音视频流,已实现 通过 URL 拉流

实现步骤

1 观众端切换拉流方式

当从 CDN 拉流切换到连麦场景时,观众端需调用 stopPlayingStream 停止当前 CDN 拉流,并调用 startPlayingStream 切换为 RTC 拉流。

//停止当前的 CDN 拉流,传入对应的主播流 ID
[[ZegoExpressEngine sharedEngine] stopPlayingStream:@"anchorStreamID"];
//切换为 RTC 拉流
ZegoCanvas *playCanvas = [ZegoCanvas canvasWithView:self.remotePlayView];
ZegoPlayerConfig *playConfig = [[ZegoPlayerConfig alloc] init];
playConfig.resourceMode = ZegoStreamResourceModeOnlyRTC;
[[ZegoExpressEngine sharedEngine] startPlayingStream:self.playStreamIDTextField.text canvas:playCanvas config:playConfig];

2 观众端开启预览和推流

传入观众端的流 ID,并开启预览 startPreview 和推流 startPublishingStream,即可连麦成功。

//开启预览
ZegoCanvas *previewCanvas = [ZegoCanvas canvasWithView:self.localPreviewView];
[[ZegoExpressEngine sharedEngine] startPreview:previewCanvas];
//开始推流,并传入观众端的流 ID
[[ZegoExpressEngine sharedEngine] startPublishingStream:@"pulishingStreamID"];

3 观众端停止预览和推流

若连麦结束,可在观众端调用 stopPreviewstopPublishingStream 接口,停止预览和推流。

//停止预览
[[ZegoExpressEngine sharedEngine] stopPreview];
//停止推流
[[ZegoExpressEngine sharedEngine] stopPublishingStream];

4 观众端连麦结束

连麦结束,传入主播的流 ID,并在观众端调用 stopPlayingStream 接口,停止 RTC 拉流 ,重新切换为 CDN 拉流,并通过 ZegoViewMode 设置 CDN 参数,详情请参考 通过 URL 拉流

//停止当前的 RTC 拉流
[[ZegoExpressEngine sharedEngine] stopPlayingStream:@"anchorStreamID"];
//切换为 CDN 拉流
ZegoCanvas *playCanvas = [ZegoCanvas canvasWithView:self.remotePlayView];
ZegoPlayerConfig *playerConfig = [[ZegoPlayerConfig alloc] init];
playerConfig.resourceMode = ZegoStreamResourceModeOnlyCDN;
ZegoCDNConfig *cdnConfig = [[ZegoCDNConfig alloc] init];
cdnConfig.url = "rtmp://xxxxxxxx"; // URL 为 CDN 拉流地址
cdnConfig.authParam = "xxx"; // 如果需要鉴权则要设置鉴权参数,如果不需要鉴权可以不设置(鉴权参数不能带"?"字符)
playerConfig.cdnConfig = cdnConfig;
[[ZegoExpressEngine sharedEngine] startPlayingStream:self.streamID canvas:playCanvas config:playerConfig];

5 主播端开启及关闭拉流

主播端通过 ZegoEventHandler 中的 onRoomStreamUpdate 回调,收到观众流新增通知后,可开启 RTC 拉流。当收到观众流删除通知后,则停止 RTC 拉流。

- (void)onRoomStreamUpdate:(ZegoUpdateType)updateType streamList:(NSArray<ZegoStream *> *)streamList extendedData:(NSDictionary *)extendedData roomID:(NSString *)roomID {
    if (updateType == ZegoUpdateTypeAdd) {
        for (ZegoStream *stream in streamList) {
            //开启 RTC 拉观众流
            ZegoCanvas *playCanvas = [ZegoCanvas canvasWithView:self.remotePlayView];
            ZegoPlayerConfig *playConfig = [[ZegoPlayerConfig alloc] init];
            playConfig.resourceMode = ZegoStreamResourceModeOnlyRTC;
            [[ZegoExpressEngine sharedEngine] startPlayingStream:stream.streamID canvas:playCanvas config:playConfig];
        }
    } else if (updateType == ZegoUpdateTypeDelete) {
        for (ZegoStream *stream in streamList) {
            //停止 RTC 拉观众流
            [[ZegoExpressEngine sharedEngine] stopPlayingStream:stream.streamID];
        }
    }
}
本篇目录