vonage音视频基本使用--web@opentok/client

vonage使用体验

总体来说,vonage算是比较偏向于原生的一个音视频三方包,提供了很多类似原生的api,有些甚至就是原生的api接口包了一层。而这样的一种形式也给开发带来了比较舒适的体验,能很清楚的了解到他的整个运行逻辑,不像腾讯音视频一样,封装了很多层,添加了很多他们自己的功能和服务,vonage更偏向于开发者自行去添加功能,去扩充。

官网链接: tokbox.com/developer/s...

主要开发方向:web端 引用方式: @opentok/client

前期需求

apikey: 使用权限key sessionId: 生成的会话ID 有这两个才能OT.initSession生成一个会话对象

javascript 复制代码
import OT from "@opentok/client";

const session = OT.initSession(apiKey, sessionId);

音视频主体

会话主体

OT.initSession(apiKey, sessionId)会生成一个会话对象,这个对象是的音视频主体,几乎所有的操作都与之息息相关。 例如 session.connect 创建 session.on 监听 session.publish 创建输出 ......

输入主体

subscriber = session.subscribe(......) subscriber指向音视频的输入主体,扬声器视频之类,能控制接收到的声音画面以及托管到哪个dom节点

javascript 复制代码
// 一般在session初始化成功后创建
session.on('streamCreated', function(event) {
 // opentok-subscriber就是要指向的dom
 subscriber = session.subscribe(event.stream, 'opentok-subscriber', {
   insertMode: 'append',
   width: '100%',
   height: '100%'
   // 这边还可以添加其他各种配置
 });
});

输出主体

publisher = OT.initPublisher(......) publisher指向的刚好和subscriber相反,是对外的输出设备,麦克风摄像头之类,而他提供的方法和subscriber基本一致。但很显然他的生成方式不同,一个是session,一个OT。所以他的使用需要进行挂载到session.

javascript 复制代码
publisher = OT.initPublisher('opentok-publisher', {
  insertMode: 'append',
  // publisher 和 subscriber都可以通过videoSource audioSource来控制设备的使用、校验、拒绝等操作
  videoSource,
  audioSource,
  // 也可以设置对应的分辨率,绝大多数情况默认都指向较低的分辨率
  resolution: '1920x1080',
  width: '100%',
  height: '100%'
});
// handleError 是对挂载创建失败的处理
session.publish(publisher ,handleError);

用户主体

session会监听每个进入会话的对象,并且能直接拿到

javascript 复制代码
session.on("connectionCreated", function(event) {
  console.log('已经连接到用户', event)
});

建立通话的基本原理

在我们初始化session之后,我们会紧接创建subscriber,这是建立通话的基本条件,也意味着我们进入了会话,进入了对应的局域网络,且随时能接收到他人数据流。

于是在双发准备建立通话时,就会去创建publisher,提供发送他人的数据流,当publisher建立成功后,数据流就会通过subscriber自动回显到dom节点上。

串联通话的桥梁

如果将subscriber和publisher建立通话比作桥梁的建立,那其中穿插的心链消息则可以作为建立桥梁过程中来来往往拉线造墩的工作,其实开发人员做的更多的也是这一块。

vonage有自己的一套心链消息,其实也就是ws的通话,session主体下的signal方法。

javascript 复制代码
// 消息的发送
session.signal({
  type: 'videoListener',
  // 可以指向一个要发送的用户主体
  to: connection,
  // 这里就是一些和另一端商量的业务数据
  data: {
    type,
    callType: callType.value,
    ...option
  }
});

// 消息的接收 一般初始化之后就会创建这个监听
session.on("signal:videoListener", function(event) {
  onSignal(JSON.parse(event.data ?? '{}'))
});

通过signal发送的一些消息可以告诉对方准备打电话了还是挂断了之类,当然不用signal也是完全没有问题,其他的ws都可以。

一些坑

  1. vonage的重连机制有点问题,长时间挂机可能会导致session主体上的session.on("connectionCreated",()=>{})方法失效,换句话说就是有新的用户进来就接收不到了。(目前解决办法:过一段时间对session进行销毁,重新建立)
  2. 初始化很快,但接入用户进入会话列表需要时间,不能一开始就进行通话之类,至于时间看网络情况,一般1~3s。(解决办法:加个loading吧)
  3. OT不存在销毁这个操作,所以即使调用了session.disconnect(),那也只是销毁session,所以一定要妥善处理,不然会导致多个视频音频使用。
相关推荐
小白640215 分钟前
2025年终总结-迷途漫漫,终有一归
前端·程序人生
烟花落o19 分钟前
贪吃蛇及相关知识点讲解
c语言·前端·游戏开发·贪吃蛇·编程学习
晚霞的不甘23 分钟前
Flutter for OpenHarmony专注与习惯的完美融合: 打造你的高效生活助手
前端·数据库·经验分享·flutter·前端框架·生活
kogorou0105-bit34 分钟前
前端设计模式:发布订阅与依赖倒置的解耦之道
前端·设计模式·面试·状态模式
止观止1 小时前
像三元表达式一样写类型?深入理解 TS 条件类型与 `infer` 推断
前端·typescript
雪芽蓝域zzs1 小时前
uniapp 省市区三级联动
前端·javascript·uni-app
Highcharts.js1 小时前
Next.js 集成 Highcharts 官网文档说明(2025 新版)
开发语言·前端·javascript·react.js·开发文档·next.js·highcharts
总爱写点小BUG1 小时前
探索 vu-icons:一款轻量级、跨平台的 Vue3 & UniApp SVG 图标库
前端·前端框架·组件库
晚霞的不甘1 小时前
Flutter for OpenHarmony手势涂鸦画板开发详解
前端·学习·flutter·前端框架·交互
We་ct1 小时前
LeetCode 73. 矩阵置零:原地算法实现与优化解析
前端·算法·leetcode·矩阵·typescript