You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:Agora.io一对一视频通话房主离开时全员退出实现方案

解决Agora.io房主离开时全员退出通话的方案

我之前在基于Agora开发视频通话功能时,正好遇到过一模一样的需求,试过几种方案后,下面这两种是最贴合需求的:

方案一:房主主动发送退出通知(适合主动退出场景)

当房主主动触发退出操作(比如点击退出按钮、页面关闭)时,先给频道内所有用户发送一条自定义的"房主离开"指令,其他用户收到指令后,执行和点击退出按钮完全一致的逻辑(调用leaveChannel()+destroy())。

具体实现步骤:

  1. 首先要在所有客户端确认房主的UID,可以通过业务服务器传递,或者房主加入频道后设置自定义用户属性标记身份。
  2. 房主端退出前发送频道消息:
// 房主退出时的逻辑(比如绑定到退出按钮点击或页面unload事件)
const exitCall = async () => {
  try {
    // 发送自定义消息通知所有人房主离开
    await client.sendChannelMessage({ text: "host_exit_trigger" });
    // 房主自己执行退出逻辑
    client.leaveChannel();
    client.destroy();
    // 更新本地UI状态
  } catch (err) {
    console.error("发送退出通知失败:", err);
    // 即使消息发送失败,房主仍执行退出
    client.leaveChannel();
    client.destroy();
  }
};
  1. 其他客户端监听频道消息,收到房主的指令后执行退出:
// 提前获取并存储房主的UID,比如从业务接口拿到
const hostUid = 10086;

client.on("ChannelMessage", (msg, uid) => {
  // 验证消息发送者是房主,且内容是退出指令
  if (uid === hostUid && msg.text === "host_exit_trigger") {
    // 执行和点击退出按钮完全一致的逻辑
    client.leaveChannel();
    client.destroy();
    // 这里可以添加UI处理,比如隐藏视频窗口、显示"房主已结束通话"提示
  }
});

方案二:监听房主离线事件(覆盖主动/被动离开场景)

如果需要覆盖房主被动离线的情况(比如网络断开、APP崩溃),可以利用Agora的UserOffline事件,当检测到房主的UID触发离线事件时,所有用户自动执行退出逻辑。

具体实现:

// 提前确认并存储房主的UID
const hostUid = 10086;

client.on("UserOffline", (uid, reason) => {
  // 判断离线的是房主,不管是主动退出还是被动断开
  if (uid === hostUid) {
    // 执行退出清理逻辑
    client.leaveChannel();
    client.destroy();
    // 更新UI提示用户通话已结束
  }
});

为什么封禁API不符合需求?

你提到的封禁用户API(kickUser)是服务端主动将用户踢出频道,但这种方式下客户端只是被动断开连接,不会主动调用destroy()清理本地的视频流资源、释放摄像头麦克风权限,和手动点击退出按钮的效果有差异。而上面两种方案都是让客户端主动执行退出逻辑,完全匹配你的需求。

额外注意点

  • 房主的UID一定要在所有客户端同步准确,建议通过业务服务器下发,避免客户端本地约定出现不一致。
  • 移动端开发时,要在对应的生命周期钩子(比如iOS的viewWillDisappear、Android的onDestroy)里处理房主的退出消息发送逻辑,确保页面/APP关闭时能触发通知。

内容的提问来源于stack exchange,提问作者Kamrul

火山引擎 最新活动