web 前端实现音视频通话 - liveKit 框架
创始人
2024-11-28 01:36:39
0次

部署方案

livekit部署

运行环境

  • go1.18以上
  • liveKit-server.exe
  • liveKit官方文档链接
  • 科学上网(github)

liveKit基础概念

在liveKit 中有两个概念,分别是:room 房间 和 user 用户

房间很好理解,类似一个腾讯会议中的 一个会议
用户指的是 加入房间的所有人。
每个用户的权限是相同的

  • 想要实现主持人功能,可以通过web服务器来对liveKit 房间中权限进行管理
    :::info
    liveKit相当于搭建了一个流媒体服务器,并且这个流媒体服务器封装了一些视频聊天的方法
    :::
    :::info
    通过go 语言开发的web服务 通过SDK 来访问 liveKit服务,并且通过SDK对liveKit 中的room以及user进行管理
    :::

业务流程


用户A 创建房间流程

  1. 用户A访问http 服务下的/getToken接口 参数如下:
  • creatRoom : true 创建房间
  • identity , 用户ID
  • roomName 房间名称
  1. 创建房间 需传入 creatRoom为0 ,房间名称为 roomName
  2. 后端根据 roomName 创建房间,并且返回token
  3. 用户A 获取到token 通过room.connect 方法连接 liveKet房间
await room.connect(wsUrl, token);  // 在开发时 wsUrl 为 ws://127.0.0.1:7880 
  1. 开始传输音频/接受音频

用户B 进入房间流程

  1. 用户B访问http 服务下的/getToken接口 参数如下:
  • creatRoom : false 加入房间
  • identity , 用户ID
  • roomName 房间名称
  1. 根据参数 roomName, 和identity 生成对应的 token
  2. 用户B获取到token 通过room.connect 方法连接 liveKet房间
await room.connect(wsUrl, token);  // 在开发时 wsUrl 为 ws://127.0.0.1:7880 
  1. 开始传输音频/接受音频

web端 向ROOM发送媒体流

相机和麦克风

将本地参与者的摄像头和/或麦克风流发布到房间

// 打开摄像头 room.localParticipant.setCameraEnabled(true)   //打开麦克风 room.localParticipant.setMicrophoneEnabled(true) 

可以通过以下方法来将自己的麦克风静音

room.localParticipant.setCameraEnabled(false) //关闭摄像头 room.localParticipant.setMicrophoneEnabled(false) //关闭麦克风 

禁用摄像头或麦克风将关闭各自的录音,房间内的其他用户将收到一个TrackMuted事件。

屏幕共享

LiveKit还支持跨所有平台的本机屏幕共享。

// 需要浏览器支持 await currentRoom.localParticipant.setScreenShareEnabled(true); 

web端 接收ROOM中的媒体流

媒体订阅

LiveKit使用两个结构来建模轨道:TrackPublication和Track。将TrackPublication视为向服务器注册的轨道的元数据,将Track视为原始媒体流。
订阅的回调将在Room和RemoteParticipant对象回调

import {   connect,   RoomEvent, } from 'livekit-client';   room   .on(RoomEvent.TrackSubscribed, handleTrackSubscribed)   function handleTrackSubscribed(   track: RemoteTrack,   publication: RemoteTrackPublication,   participant: RemoteParticipant ) {  } 

媒体播放

订阅了音频就可以播放了

function handleTrackSubscribed(   track: RemoteTrack,   publication: RemoteTrackPublication,   participant: RemoteParticipant ) {   // attach track to a new HTMLVideoElement or HTMLAudioElement   const element = track.attach();   parentElement.appendChild(element);   // or attach to existing element   // track.attach(element) } 

说话人检测

当音轨发布时,LiveKit将检测正在说话的参与者。扬声器更新将为本地和远程参与者发送。

room.on(RoomEvent.ActiveSpeakersChanged, (speakers: Participant[]) => {   // 包含所有当前活动的扬声器 })   participant.on(ParticipantEvent.IsSpeakingChanged, (speaking: boolean) => {   console.log(`${participant.identity} is ${speaking ? "now" : "no longer"} speaking. audio level: ${participant.audioLevel}`) }) 

开发流程

启动liveKit服务

./liveKit-server.exe --dev  注: 在本地开发环境下只能使用服务默认的key 和 secret 如下 var appKey = "devkey" var appSecret = "secret" 

image.png
:::info
启动成功后如上图所示
:::

  • 其中 starting LiveKet server 后 端口7880 为后端管理room 时使用

image.png

  • 其中7881 与7882 分别是TCP /UDP 链接端口
  • ps:需要在生产环境中配置文件中设置开启,本地启动默认7880端口

go引入 livekit/server-sdk-go 包 创建web服务器

2.1 web服务器用来生成 liveKit可以识别进入房间的token
image.png

创建token接口,根据秘钥生成房间的token

image.png

使用roomClient方法 连接 liveKit服务

image.png

根据liveKit文档通过Room 的相关API管理liveKit中的room

image.png

测试项目

  • 前端vue3 + iview
  • 后端 go + gin框架
  • 仓库中附带windows 环境下liveKit服务应用
  • 初步实现双方语音对讲功能,在云服务器环境下经过测试延迟情况良好,基本达到微信语音水平
  • 服务器配置如下

image.png

  • 测试负载:
  • 单房间,三用户,语音聊天

待完善

  • go 后端设想引入socket服务,用来更新房间数据到用户端

Events 回调事件

room.on(RoomEvent.TrackSubscribed, 回调函数);  
事件描述房间事件用户事件
ParticipantConnected远程参与者在本地参与者之后加入x
ParticipantDisconnected远程参与者离开x
Reconnecting它正在尝试重新连接x
Reconnected重新连接已成功x
Disconnected由于房间关闭、故障 而 断开连接、链接失败x
TrackPublished本地参与者加入后,新曲目将发布到房间xx
TrackUnpublished远程参与者已取消发布曲目xx
TrackSubscribed本地参与者已订阅曲目xx
TrackUnsubscribed先前订阅的曲目已取消订阅xx
TrackMuted一个曲目被静音,本地曲目和远程曲目都会触发xx
TrackUnmuted轨道未静音,本地轨道和远程轨道都有声音xx
LocalTrackPublished本地轨道已成功发布xx
LocalTrackUnpublished本地轨道未发布xx
ActiveSpeakersChanged当前活动的扬声器已更改x
IsSpeakingChanged当前参与者已更改发言状态x
ConnectionQualityChanged参与者的连接质量已更改xx
ParticipantMetadataChanged参与者的元数据已通过服务器API更新xx
RoomMetadataChanged与房间关联的元数据已更改x
DataReceived从另一个参与者或服务器接收的数据xx
TrackStreamStateChanged指示订阅的轨道是否因带宽而暂停xx
TrackSubscriptionPermissionChanged订阅的轨道之一已更改当前参与者的轨道级别权限xx
ParticipantPermissionsChanged当前参与者的权限已更改xx

此表捕获了跨平台SDK可用的一组一致事件。除了此处列出的内容之外,某些平台上可能还有特定于平台的事件。

服务器部署liveKit server

使用docker方式部署

  • 未测试

直接运行 liveKit 服务

  • 使用官方提供的liveKit-server 运行包,直接运行
./live-server --config ./config.yaml 
  • 上述命令执行了在同级目录下的 live-server 服务的 配置文件
  • 使用nginx 反向代理ws 协议与http协议到liveKit 端口,实现用户端网页直接访问 liveKit 服务。

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...