Project Icon

twilio-video-app-react

基于Twilio的多人视频会议和实时聊天React应用

这是一个基于Twilio SDK的开源React应用,支持多人视频会议、实时聊天和屏幕共享。它可快速部署到Twilio Serverless,并提供主讲人检测、网络质量指示等功能。该项目展示了如何构建高质量的视频通话应用,适合开发者学习和参考。

Twilio视频 React应用

CircleCI

[!警告]
我们不再允许新客户加入Twilio视频服务。自2026年12月5日起,Twilio视频将结束生命周期(EOL),并将停止为所有客户提供服务。有关此EOL的更多信息,请参阅我们帮助中心此处

这是什么

本应用程序展示了一个基于Twilio的可编程视频JS SDKTwilio的对话JS SDKCreate React App构建的多方视频应用。

  • 只需几分钟即可部署到Twilio无服务器平台
  • 无需其他基础设施
  • 首次部署前无需更改代码
  • 部署应用程序不产生任何费用
  • Go房间的使用是免费的,但在使用其他所有房间类型时,应用程序将按标准使用费率收费。聊天功能基于对话API构建,每月活跃用户数不超过200时免费,此后按标准使用费率收费。

应用预览

先决条件

您必须安装以下内容:

您可以使用以下命令检查当前安装的Node.js和NPM版本:

node --version
npm --version

克隆存储库

克隆此存储库并进入项目目录:

git clone https://github.com/twilio/twilio-video-app-react.git
cd twilio-video-app-react

安装依赖项

在主项目文件夹内运行npm install以安装NPM的所有依赖项。

如果您想使用yarn安装依赖项,请先运行yarn import命令。这将确保yarn安装package-lock.json中指定的包版本。

添加噪音消除

Twilio视频与Krisp Technologies Inc.合作,为本地音频轨道添加了噪音消除功能。此功能根据Twilio的Krisp插件许可。要将此功能添加到您的应用程序中,请在上一步之后立即运行npm run noisecancellation:krisp

安装Twilio CLI和RTC插件

安装Twilio CLI

该应用程序使用Twilio CLI部署到Twilio。您可以在Mac上使用Homebrew或npm安装Twilio CLI

要使用npm安装twilio-cli,请运行以下命令:

npm install -g twilio-cli

注意:如果在使用npm install -g命令全局安装twilio-cli时遇到权限错误,您可能需要更改全局node_modules目录的权限,或配置npm使用不同的目录来全局安装npm包。请参阅此StackOverflow帖子,其中包含有关这两个选项的更多信息。GitHub中的这个代码示例也是一个有用的指南,介绍了如何在不需要更改目录权限和不使用sudo的情况下全局安装npm包。

登录Twilio CLI

登录Twilio CLI。系统将提示您输入Account SID和Auth Token,这两个信息都可以在Twilio控制台的仪表板上找到。

twilio login

注意:如果您使用npm安装了Twilio CLI,但收到找不到twilio命令的错误,您可能需要更新Node安装前缀。有关更多信息,请参阅此StackOverflow帖子

安装RTC插件

此应用程序需要一个额外的插件。使用以下命令安装CLI插件:

twilio plugins:install @twilio-labs/plugin-rtc

注意:如果您之前已安装@twilio-labs/plugin-rtc插件,请确保使用最新版本。您可以通过运行twilio plugins:update来升级插件。聊天功能需要@twilio-labs/plugin-rtc的0.8.1或更高版本。

将应用程序部署到Twilio

在部署应用程序之前,请确保您在Twilio CLI上使用的是正确的账户(使用twilio profiles:list命令检查)。 使用单个命令将应用程序部署到Twilio:

npm run deploy:twilio-cli

这将执行以下步骤:

  • src目录中构建React应用程序
  • 生成用于访问视频应用程序的随机代码
  • 将React应用程序和令牌服务器功能部署为Twilio无服务器服务
  • 打印应用程序的URL和密码

注意: 通过密码提供访问令牌的Twilio函数不应在生产环境中使用。此令牌服务器支持无缝启动协作应用程序,虽然方便,但密码对于生产环境来说不够安全。您应该使用身份验证提供程序来安全地为客户端应用程序提供访问令牌。您可以在本教程中找到有关可编程视频访问令牌的更多信息。作为预防措施,密码将在一周后过期。要生成新密码,请重新部署应用程序:

npm run deploy:twilio-cli -- --override

查看应用程序详情

使用以下命令查看视频应用程序的URL和密码:

 twilio rtc:apps:video:view

删除应用程序

使用以下命令删除应用程序:

twilio rtc:apps:video:delete

这将从Twilio中删除无服务器应用程序。这将确保不再因应用程序产生任何费用。

Twilio CLI故障排除

如果在运行Twilio CLI RTC插件命令后出现任何错误,请尝试以下步骤。

  1. 运行twilio plugins:update将rtc插件更新到最新版本。
  2. 运行twilio rtc:apps:video:delete删除任何现有的视频应用程序。
  3. 运行npm run deploy:twilio-cli部署新的视频应用程序。

不同房间类型的应用程序行为

在运行将应用程序部署到Twilio的命令后,房间类型将在命令行输出中返回。每种房间类型提供不同的视频体验。有关这些房间类型的更多详细信息,可以在这里找到。本节的其余部分将解释这些房间类型如何影响视频应用程序的行为。

Group - Group房间类型允许最多五十名参与者加入应用程序中的视频房间。网络质量级别(NQL)指示器、主导发言人和开始-停止录音在此房间类型中得到演示。此外,默认设置了启用模拟广播的VP8视频编解码器以及带宽配置文件,以提供最佳的群组视频应用体验。

Small Group - 这是一种旧版房间类型;在开发多方应用程序时,我们建议使用Group房间。 Small Group房间类型提供相同的群组视频应用体验,只是参与者数量限制较小,为四人。 点对点 - 虽然最多可以有十名参与者加入使用点对点(P2P)房间类型的房间,但它最适合一对一的视频体验。网络质量指标、带宽配置、主导发言人和开始停止录制等功能无法在此房间类型中使用。因此,这些功能在视频应用中未展示。此外,为了提供最佳的一对一视频应用体验,默认设置了禁用联播的VP8视频编解码器和720p最小视频捕捉尺寸。如果超过十名参与者加入此类型的房间,视频应用将显示错误。

Go - Go房间类型提供类似的点对点视频应用体验,但参与者限制更少,只有两人。如果超过两名参与者加入此类型的房间,视频应用将显示错误。

对于所有房间类型,如果超过最大参与者数量,视频应用都将显示错误。

功能

该视频应用具有以下功能:

  • 具有实时视频和音频的视频会议
  • 支持文字和文件消息的聊天功能
  • 开启/关闭摄像头
  • 麦克风静音/取消静音
  • 屏幕共享
  • 主导发言人指示器
  • 网络质量指示器
  • 使用带宽配置API定义参与者带宽使用
  • 使用录制规则API开始和停止录制

浏览器支持

请参阅twilio-video.js SDK的浏览器支持表。

深入探讨

运行本地令牌服务器

本应用程序需要访问令牌来连接视频房间和聊天对话。随附的本地令牌服务器为应用程序提供访问令牌。此令牌服务器可用于本地运行应用程序,并在使用npm start以开发模式运行应用程序时使用。执行以下步骤设置本地令牌服务器:

  • 在Twilio控制台创建账户。
  • 点击"设置"并记下您的账户SID。
  • 在Twilio控制台的可编程视频工具下的API密钥部分创建新的API密钥。记下新API密钥的SID和密钥。
  • 在Twilio控制台的对话选项卡下的服务部分创建新的对话服务。记下生成的SID。
  • 将您的账户SID、API密钥SID、API密钥密钥和对话服务SID存储在应用程序根目录下的新文件.env中(示例如下)。
TWILIO_ACCOUNT_SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_API_KEY_SID=SKxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_API_KEY_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TWILIO_CONVERSATIONS_SERVICE_SID=ISxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

现在本地令牌服务器可以分发访问令牌以连接房间和对话。有关可用附加环境变量的信息,请参阅.env.example。

注意: Twilio对话的使用是可选的。如果您希望选择退出,只需在设置REACT_APP_DISABLE_TWILIO_CONVERSATIONS环境变量为true的情况下运行或构建此应用程序。

本地运行应用程序

使用以下命令在本地运行应用程序:

npm start

这将启动本地令牌服务器并以开发模式运行应用程序。在浏览器中打开http://localhost:3000即可看到应用程序。

如果您对src/中的源代码进行更改,页面将重新加载。 您还将在控制台中看到任何lint错误。使用以下命令在本地启动令牌服务器:

npm run server

令牌服务器在8081端口上运行,并期望在/token路由上收到具有以下JSON参数的POST请求:

{
  "user_identity": string, // 用户身份
  "room_name": string, // 房间名称
}

响应将是可用于连接房间的令牌。本应用程序提供的服务器使用与用于部署应用程序的Twilio CLI插件plugin-rtc相同的端点。有关服务器端点的更详细信息,请参阅plugin-rtc README。

房间中的多个参与者

如果您想了解应用程序如何处理多个参与者,只需在浏览器中打开多个localhost:3000标签,并使用不同的用户名连接到同一个房间即可。

此外,如果您想邀请其他参与者加入房间,每个参与者都需要安装此应用程序,并使用相同的房间名称和账户SID(API密钥和密钥可以不同)。

构建

使用以下命令构建React应用程序:

npm run build

此脚本将在build/目录中构建应用程序的静态资产。

测试

本应用程序有单元测试(使用Jest)和端到端测试(使用Cypress)。您可以使用以下脚本运行测试。

单元测试

使用以下命令运行单元测试:

npm test

这将使用Jest运行所有单元测试,并将结果输出到控制台。

端到端测试

使用以下命令运行端到端测试:

npm run cypress:open

这将打开Cypress测试运行器。打开后,选择要运行的测试文件。

注意: 在运行这些测试之前,请确保完成"入门"部分。这些Cypress测试将连接到真实的Twilio房间和对话,因此您可能会被收取使用的时间费用。

应用程序架构

本应用程序的状态(除少数例外)由SDK提供的房间对象管理。房间对象包含用户所连接房间的所有信息。可以在这里查看房间对象的类层次结构。

了解房间对象的一个好方法是在浏览器控制台中探索它。当您连接到房间时,应用程序会将房间对象作为窗口变量公开:window.twilioRoom。

由于Twilio Video SDK管理房间对象状态,因此可以将其用作真实来源。无需使用Redux等工具来跟踪房间状态。房间对象及其大多数子属性都是事件发射器,这意味着我们可以订阅这些事件以在房间状态变化时更新React组件。

React钩子可用于订阅事件并触发组件重新渲染。本应用程序经常使用useState和useEffect钩子来订阅房间状态的变化。以下是一个简单的示例:

import { useEffect, useState } from 'react';

export default function useDominantSpeaker(room) {
  const [dominantSpeaker, setDominantSpeaker] = useState(room.dominantSpeaker);

  useEffect(() => {
    room.on('dominantSpeakerChanged', setDominantSpeaker);
    return () => {
      room.off('dominantSpeakerChanged', setDominantSpeaker);
    };
  }, [room]);

  return dominantSpeaker;
}

在这个钩子中,useEffect钩子用于订阅房间对象发出的dominantSpeakerChanged事件。当这个事件被发出时,setDominantSpeaker函数被调用,它将更新dominantSpeaker变量并触发使用这个钩子的任何组件的重新渲染。 有关如何将React钩子与Twilio Video SDK一起使用的更多信息,请参阅此教程:https://www.twilio.com/blog/video-chat-react-hooks。要查看此应用程序使用的所有钩子,请查看`src/hooks`目录。

VideoProvider组件包含了许多与连接视频房间和获取本地输入设备相关的逻辑。VideoProvider组件通过useVideoContext钩子向应用程序的其他部分公开了许多属性和方法。同样,ChatProvider包含了与连接Twilio Conversation相关的逻辑,并通过useChatContext钩子公开属性和方法。

配置

SDK中的connect函数接受一个配置对象。此应用程序的配置对象可以在src/utils/useConnectionOptions/useConnectionOptions.ts中找到。在这个对象中,我们1)启用主导发言者检测,2)启用网络质量API,以及3)提供各种选项来配置带宽配置文件

轨道优先级设置

此应用程序动态改变远程视频轨道的优先级,以提供最佳的协作体验。任何将在主视频区域显示的视频轨道在组件挂载时都会调用track.setPriority('high')(参见VideoTrack组件)。这个更高的优先级使轨道能够以高分辨率渲染。当组件卸载时调用track.setPriority(null),使轨道的优先级设置为其发布优先级(低)。

使用Firebase进行Google身份验证(可选)

可以配置此应用程序在用户使用应用程序之前进行身份验证。一旦用户使用Google凭据登录应用程序,他们的Firebase ID Token将包含在用于获取访问令牌的HTTP请求的Authorization头中。然后,分发连接房间访问令牌的服务器可以验证Firebase ID Token。

有关启用Google身份验证必须设置的环境变量的说明,请参见.env.example

相关

许可

有关详细信息,请参阅LICENSE文件。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号