videocalling
参与者(Participant)

参与者(Participant)

功能

加入和参加视频会议的人员,具有标准用户权限和能力

什么是参与者?

参与者(也称为与会者或成员)是加入视频会议的任何人。与主持人不同,参与者拥有标准用户权限和对会议设置的有限控制。参与者可以看到和听到其他与会者,通过音频/视频进行交流,共享内容(如果被允许),并使用协作功能,但不能管理会议范围的设置或调节其他参与者。

参与者角色是大多数加入会议的用户的默认角色,主持人能够根据需要将参与者提升为联合主持人或分配额外的权限。

参与者能力

标准权限

所有参与者可用的典型能力:

  • 音频/视频控制:静音/取消静音自己的麦克风和打开/关闭摄像头
  • 查看其他参与者:查看视频流和参与者列表
  • 屏幕共享:共享屏幕(如果主持人已启用此权限)
  • 聊天消息:向所有人或特定参与者发送消息(基于主持人设置)
  • 反应:使用表情符号反应、举手或其他非语言提示
  • 查看共享内容:查看其他人共享的屏幕、演示文稿或文件
  • 重命名自己:更改自己的显示名称
  • 离开会议:随时退出会议

受限操作

参与者在没有主持人权限的情况下无法执行的操作:

  • 无法静音其他参与者(除了自己)
  • 无法将参与者从会议中移除
  • 无法从等候室准入参与者
  • 无法锁定会议或为其他人结束会议
  • 无法开始或停止录制(在大多数平台上)
  • 无法创建或管理分组讨论室
  • 无法更改会议范围的设置
  • 无法提升或降级其他参与者

参与者类型

经过身份验证的参与者

使用经过验证的身份加入的参与者:

  • 组织成员:主持人组织的员工或成员
  • 受邀宾客:拥有日历邀请或访问链接的外部参与者
  • 注册用户:在平台上拥有帐户的参与者
// 使用身份验证加入会议
const session = await join({
  url: meetingUrl,
  token: authenticatedUserToken,
  userName: 'John Doe',
  userData: {
    role: 'participant',
    email: '[email protected]',
    department: 'Engineering'
  }
});

匿名参与者

在没有正式身份验证的情况下加入的参与者:

  • 访客用户:通过公共链接加入,无需帐户
  • 有限可见性:可能显示电子邮件域而不是完整详细信息
  • 额外筛选:可能需要从等候室获得主持人批准

特殊参与者类型

  • 演示者:具有提升权限以共享内容的参与者(在网络研讨会中常见)
  • 小组成员:网络研讨会式会议中的演讲者,具有观众可见性
  • 与会者:大型活动中的仅查看参与者(无法取消静音或共享)
  • 口译员:提供实时语言翻译的参与者

参与者状态管理

连接状态

参与者可以处于各种连接状态:

  • 加入中:正在连接到会议的过程中
  • 等待:在等候室等待主持人准入
  • 活跃:已连接并参与会议
  • 离开:已加入但不活跃(可能在其他应用/标签页中)
  • 重新连接中:临时断开连接,尝试重新加入
  • 已离开:已退出会议
// 跟踪参与者状态变化
socket.on('participant-state-changed', ({ participantId, state, reason }) => {
  updateParticipantUI(participantId, {
    state: state, // 'active', 'away', 'reconnecting'
    lastActivity: Date.now()
  });
  
  if (state === 'reconnecting') {
    showNotification(`${participantName} 正在重新连接...`);
  }
});

媒体状态

  • 音频已静音/未静音:麦克风状态
  • 视频开/关:摄像头状态
  • 屏幕共享:当前是否正在共享屏幕
  • 举手:请求发言
  • 说话中:当前正在说话(通过音频电平检测)

参与者列表和界面

参与者面板

大多数视频会议应用程序在专用面板中显示参与者:

  • 排序列表:按字母顺序或加入时间排序,主持人通常首先显示
  • 状态指示器:显示静音状态、举手、屏幕共享的图标
  • 音频电平:谁正在说话的视觉指示器
  • 连接质量:网络强度指示器
  • 快速操作:用于直接消息、固定视频等的按钮
// 参与者数据结构
const participant = {
  id: 'user-123',
  name: 'John Doe',
  role: 'participant',
  isHost: false,
  audio: {
    muted: false,
    level: 0.75 // 0-1 范围
  },
  video: {
    enabled: true,
    quality: 'high'
  },
  connectionQuality: 'good', // 'excellent', 'good', 'poor', 'reconnecting'
  joinTime: 1640000000000,
  handRaised: false,
  reactions: [],
  screenSharing: false
};

网格视图 vs 画廊视图

  • 网格视图:所有参与者的大小相等的磁贴
  • 演讲者视图:活跃演讲者的大视图,其他人的缩略图
  • 画廊视图:显示所有参与者的分页网格
  • 自定义布局:聚焦特定参与者

参与者互动

非语言交流

参与者使用各种非语言方法进行交流:

  • 举手:请求发言或提问
  • 表情符号反应:竖起大拇指、鼓掌、心形等
  • 状态更新:离开、请勿打扰、通话中
  • 自定义反应:特定于平台的动画反应

聊天和消息

参与者可以发送具有各种范围的消息:

  • 公开聊天:所有参与者都可见的消息
  • 私人消息:发送给特定参与者的直接消息
  • 仅主持人消息:仅发送给主持人/调节者的问题或注释

投票和问答

  • 回答投票:回应调查或问题
  • 提交问题:在问答面板中提问
  • 为问题投票:对其他参与者的问题投票

WebRTC 中的实现

将参与者添加到会议

// 服务器端:将参与者添加到会议
function addParticipant(meetingId, userId, userData) {
  const participant = {
    id: userId,
    name: userData.name,
    email: userData.email,
    role: 'participant',
    joinTime: Date.now(),
    mediaState: {
      audioMuted: true, // 默认静音
      videoEnabled: false
    },
    permissions: getParticipantPermissions(meetingId)
  };
  
  // 添加到会议参与者列表
  meetings.get(meetingId).participants.set(userId, participant);
  
  // 通知现有参与者
  broadcastToMeeting(meetingId, {
    type: 'participant-joined',
    participant: participant
  }, userId); // 排除加入的用户
  
  // 向新用户发送参与者列表
  sendToUser(userId, {
    type: 'meeting-joined',
    meeting: getMeetingInfo(meetingId),
    participants: Array.from(meetings.get(meetingId).participants.values())
  });
  
  return participant;
}

参与者权限

// 根据会议设置定义参与者权限
function getParticipantPermissions(meetingId) {
  const settings = getMeetingSettings(meetingId);
  
  return {
    canShareScreen: settings.allowParticipantScreenShare,
    canChat: settings.chatEnabled,
    canSendPrivateMessages: settings.allowPrivateChat,
    canRaiseHand: true,
    canReact: settings.reactionsEnabled,
    canRenameself: settings.allowRename,
    canUnmuteSelf: settings.allowUnmute || false,
    canEnableVideo: settings.allowVideo !== false
  };
}

参与者限制

特定于平台的最大值

  • Zoom:最多 1,000 名参与者(因计划而异),屏幕上显示 49 个视频
  • Google Meet:最多 500 名参与者(企业版),网格中显示 49 个磁贴
  • Microsoft Teams:最多 10,000 名仅查看的与会者(网络研讨会模式),1,000 名互动参与者
  • Webex:最多 100,000 名仅查看,1,000 名互动

性能考虑

  • 视频渲染:浏览器对同时视频解码的限制(通常为 25-49)
  • 带宽:更多参与者 = 更多要接收的流(在 P2P 或 SFU 中)
  • CPU 使用率:每个视频解码都需要 CPU 资源
  • 界面复杂性:大型参与者列表需要虚拟滚动和分页

参与者最佳实践

会议礼仪

  1. 准时加入:提前几分钟到达以测试设备
  2. 不说话时静音:减少背景噪音
  3. 使用视频:启用摄像头以更好地参与(适当时)
  4. 专业背景:使用虚拟背景或确保环境整洁
  5. 着装得体:着装应与面对面会议相同
  6. 最小化干扰:关闭不必要的应用程序,将手机静音

参与技巧

  • 使用反应:提供非语言反馈以避免中断
  • 举手:等待被认可而不是打断
  • 谨慎使用聊天:分享链接和提问,而不干扰流程
  • 注意力集中:不要过度多任务,保持参与

参与者的无障碍功能

  • 隐藏式字幕:为听力受损者启用实时字幕
  • 屏幕阅读器:支持视觉受损的参与者
  • 键盘快捷键:快速访问静音、摄像头、举手
  • 高对比度模式:视觉无障碍选项
  • ASL 翻译:为聋人参与者固定口译员

参考资料