Flutter集成Agora直播时Cohost退出导致全频道直播终止问题
问题根源
Agora RTC SDK本身不会自动触发全频道直播结束,你遇到的问题是业务层的事件监听逻辑没有区分原始房主和联席主持人身份导致的:当前你的逻辑只要收到主播(Broadcaster角色)离线/切回观众的回调,就直接执行了全频道结束直播的操作,没有校验离开的主播是不是发起直播的原始房主。
修复步骤
- 新增原始房主身份标识
创建直播频道时,原始房主需要将自己的UID写入频道公共属性中,所有频道内用户都可读取该标识校验身份:
// 原始房主创建频道时执行一次 await client.addOrUpdateChannelAttributes(widget.channelName, [ AgoraRtmChannelAttribute("originalHostUid", 当前房主UID.toString()) ], true);
- 修改主播离开事件的处理逻辑
你当前监听userOffline、onClientRoleChanged回调的代码中,只要有主播离开就会触发结束逻辑,需要增加身份校验:
// 示例:修正userOffline回调的处理逻辑 void onUserOffline(int uid, int reason) async { // 读取频道属性中的原始房主UID final channelAttrs = await client.getChannelAttributes(widget.channelName); final originalHostUid = channelAttrs.firstWhere( (attr) => attr.key == "originalHostUid", orElse: () => AgoraRtmChannelAttribute("originalHostUid", "") ).value; // 只有离开的用户是原始房主时,才执行结束直播逻辑 if (uid.toString() == originalHostUid) { // 原有结束直播的业务逻辑:弹出页面、提示等 Navigator.popUntil(context, (route) => route.isFirst); } else { // 联席主持人离开,仅移除对应远端视频渲染即可,不触发全局结束 setState(() { remoteVideoList.remove(uid); }); } }
- 优化联席主持人退出逻辑
联席主持人切回观众角色前,先关闭本地音视频流,避免残留回调影响:
await _engine.muteLocalAudioStream(true); await _engine.muteLocalVideoStream(true); await _engine.setClientRole(ClientRole.Audience);
额外排查点
如果修改后问题仍然存在,检查是否有监听频道内主播数量的逻辑:如果你的规则是「主播数量为0时结束直播」,需要增加额外判断:只有原始房主也不在频道内时,才执行结束逻辑,避免原始房主还在、仅联席主持人全部退出时误触发结束。
内容的提问来源于stack exchange,提问作者Isis Curiel
相关产品推荐
相关产品推荐

