提交工单
咨询集成、功能及报价等问题
在连麦场景中,由于 CDN 拉流和 CDN 推流都有很高的延迟,会导致连麦过程互动体验很差,因此推荐在连麦过程中使用 RTC 拉流和 RTC 推流,麦下再恢复 CDN 拉流,以提升连麦体验。本文将介绍在完整的 CDN 地址拉流方式下,如何实现连麦过程。
拉流方式 | 适应场景 | 延迟情况 |
---|---|---|
从 CDN 拉流 |
观众不需要与主播连麦,通过弹幕等方式与主播互动,对观看的实时性要求不高。 |
延迟超过 3 秒 |
从 RTC 拉流 |
观众需要与主播连麦,且与主播互动交流实时性要求较高。 |
连麦双方延迟低于 300 毫秒 |
如需从 CDN 拉流切换到连麦场景,请确保当前音视频流,已实现 通过 URL 拉流。
当从 CDN 拉流切换到连麦场景时,观众端需调用 stopPlayingStream 停止当前 CDN 拉流,并调用 startPlayingStream 切换为 RTC 拉流。
//停止当前的 CDN 拉流,传入对应的主播流 ID
engine.stopPlayingStream(anchorStreamID);
//切换为 RTC 拉流
ZegoCanvas zegoCanvas = new ZegoCanvas(view);
zegoCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
ZegoPlayerConfig playerConfig = new ZegoPlayerConfig();
playerConfig.resourceMode = ZegoStreamResourceMode.ONLY_RTC;
engine.startPlayingStream(anchorStreamID, zegoCanvas, playerConfig);
传入观众端的流 ID,并开启预览 startPreview 和推流 startPublishingStream,即可连麦成功。
//开启预览
ZegoCanvas previewCanvas = new ZegoCanvas(view);
previewCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
engine.startPreview(previewCanvas);
//开始推流,并传入观众端的流 ID
engine.startPublishingStream(pulishingStreamID);
若连麦结束,可在观众端调用 stopPreview 和 stopPublishingStream 接口,停止预览和推流。
//停止预览
engine.stopPreview();
//停止推流
engine.stopPublishingStream();
连麦结束,传入主播的流 ID,并在观众端调用 stopPlayingStream 接口,停止 RTC 拉流 ,重新切换为 CDN 拉流,并通过 ZegoViewMode 设置 CDN 参数,详情请参考 通过 URL 拉流。
//停止当前的 RTC 拉流
engine.stopPlayingStream(anchorStreamID);
//切换为 CDN 拉流
ZegoCanvas zegoCanvas = new ZegoCanvas(view);
zegoCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
ZegoPlayerConfig playerConfig = new ZegoPlayerConfig();
playerConfig.cdnConfig = new ZegoCDNConfig(); // 设置 CDN 参数
playerConfig.cdnConfig.url = "rtmp://xxxxxxxx"; // URL 为 CDN 拉流地址
playerConfig.cdnConfig.authParam = "xxx"; // 如果需要鉴权则要设置鉴权参数,如果不需要鉴权可以不设置(鉴权参数不能带"?"字符)
engine.startPlayingStream(anchorStreamID, zegoCanvas, playerConfig);
主播端通过 IZegoEventHandler 中的 onRoomStreamUpdate 回调,收到观众流新增通知后,可开启 RTC 拉流。当收到观众流删除通知后,则停止 RTC 拉流。
private final IZegoEventHandler eventHandler = new IZegoEventHandler() {
@Override
public void onRoomStreamUpdate(String roomID, ZegoUpdateType updateType, ArrayList<ZegoStream> streamList, JSONObject extendedData) {
super.onRoomStreamUpdate(roomID, updateType, streamList, extendedData);
if (ZegoUpdateType.ADD == updateType) {
for (ZegoStream stream : streamList) {
//开启 RTC 拉观众流
ZegoCanvas zegoCanvas = new ZegoCanvas(view);
zegoCanvas.viewMode = ZegoViewMode.ASPECT_FILL;
ZegoPlayerConfig playerConfig = new ZegoPlayerConfig();
playerConfig.resourceMode = ZegoStreamResourceMode.ONLY_RTC;
engine.startPlayingStream(stream.streamID, zegoCanvas, playerConfig);
}
} else if (ZegoUpdateType.DELETE == updateType) {
for (ZegoStream stream : streamList) {
//停止 RTC 拉观众流
engine.stopPlayingStream(stream.streamID);
}
}
}
};
联系我们
文档反馈