新知实验室_初探腾讯云音视频

news2024/11/16 17:49:08

本文目标:

  • 了解 TRTC 的基本概念
  • 初步运行 demo 调用 API
  • 完成进入视频房间
  • 完成多人进入同一房间

一、腾讯 TRTC

可能有些同学并不知道 RTC 的相关概念, 这里先简单说一下。

WebRTC(web Real-Time Communication) 是指网站实时音视频通话技术。
这项技术允许网络应用或者网络站点,在不借助任何中间媒介和第三方工具的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和音频流或者其他任意数据的传输,感兴趣的小伙伴可以自行搜索了解下。

TRTC (Tencent Real-Time Communication)是腾讯业务中的一项,也是 WebRTC的一种实现。

TRTC 主要提供了两个场景

  • 多人音视频通话
  • 低延时互动直播

那么与其他的 WebRTC 相比,TRTC 具有哪些优点呢?

  1. 更清晰更直观的接口文档:中文版式,图文互补
  2. 更全面更详细的代码示例:API 示例 + 场景方案
  3. 所见即所需的实时传输:借助腾讯云覆盖全球的专线网络和优质的节点资源,为使用者提供了便捷快速的全球语音视频服务
  4. 超多的平台支持:打通 Web,Android,iOS,Windows,MacOS、小程序等多平台
  5. 强大的 API 集成:除了基础的语音通话视频直播,还提供了如连麦、PK、卡拉OK、虚拟成像、基础美颜、屏幕分享、变声、耳返等更多功能支持
  6. 超低的学习成本:提供了多个平台的基础 demo,可以直接下载运行查看效果
  7. 场景化定制组件:提供了音视频通话、多人会议、在线直播、在线K歌等常用组件,只需要安装,引入,使用,三步完成场景搭建

二、初步体验

  1. 首先需要登录腾讯云 TRTC,点击链接微信扫码注册即可,然后按照相关法律法规要求,进行实名认证,这里就不过多赘述了。

  2. 实名认证后,进入应用管理,创建自己的应用。

在这里插入图片描述

TRTC 以项目的方式进行接口管理,每一个创建成功的项目,都会被分配携带一个 SDKAppIDSecretKey。其中

  • SDKAppID 是项目的标识,用于业务隔离。
  • SecretKey 是初始化 SDK 配置文件的密钥信息。
  • 这两个信息可以在应用管理的列表中获取,也可以根据平台引导自行查看

在这里插入图片描述

⚠️ 请不要泄漏你的SecretKey,否则可能造成流量盗用

完成上面的步骤以后,就可以进入到第三步了。

  1. 下载SDK 以及相应的 demo, 这一步我选择 web 项目
  2. 然后在本地打开 demo,将 demo 中src/utils/generateTestUserSig.ts文件中的SDKAPPIDSECRETKEY替换为上面创建好的项目的SDKAppIDSecretKey
    在这里插入图片描述
  3. 然后在此文件的根目录下运行npm start 就可以看到效果了。

当然了,到这一步只能算万里长征的第一步。后面我们还需要针对性的理解几个概念。

三、深入理解

在理解实际的直播场景之前,我们需要先理解如下几个概念:

namedescfunctional
Client音视频通话客户端对象进入通话房间、发布本地数据流、订阅远端数据流
Stream数据流(音频、视频)播放、暂停
LocalStream本地数据流TRTC.createStream() 创建
RemoteStream远端数据流Client.on(‘stream-added’)获取
roomId房间标识(唯一)-
role用户标识(唯一)-
userSig进房鉴权票据-

有些童鞋被本地数据流和远端数据流的概念困扰,这里简单说一下,本地数据流可以理解为自己的声音和图像,远端数据流就是房间中其他人的声音和图像。

userSig

userSig 是比较特殊的一项,因为它是通过计算得到的加密数据。

每个用户在进入房间都需要验证 userSig,就好比你进入电影院看电影要买电影票一样,本质上,它是一种安全保护签名,目的是为了阻止恶意攻击者盗用云服务使用权。

userSig 由 HMAC SHA256 加密算法基于SDKAppIDUserID等数据计算得出,其计算的基本方式是

hmacsha256(
	secretkey, 
	(userid + sdkappid + currtime + expire + 
     base64(userid + sdkappid + currtime + expire)))

这个加密还是很复杂的,但是放在前端依旧不安全,在真实的线上环境, UserSig 的计算代码应该放在业务服务器上,然后由 App 在需要的时候向服务器获取实时算出的 UserSig

更多内容在这里

生命周期

有了上面的概念支持,我们大概就知道视频房间是什么样子的。接下来看一下 client 生命周期。

在这里插入图片描述
从生命周期图中可以看出来,TRTC 的设计是非常简洁的,从创建房间到加入、离开只需要调用几个固定的方法,这些方法都可以在这里找到,感兴趣的话可以点开看详细的内容。

四、动手实践

为了演示方便,我直接在 demo 项目中动手了,需求就是创建一个直播间。

在router 中加入一个新的路由

 {
    path: '/myroom',
    name: 'myroom',
    component: () => import('../views/video/myroom.vue'),
  },

然后在myroom.vue中写入如下代码

<template>
    <div id="local"></div>
 </template>
 
 <script lang="ts" setup>
 import TRTC from 'trtc-js-sdk';
 import { genTestUserSig } from '@/utils/generateTestUserSig';
 import { getParamKey } from '@/utils/utils';
 
 const userId = getParamKey('userId');
 const { sdkAppId, userSig } = genTestUserSig({ sdkAppId: 0, userId, secretKey: '' });
 
 const Client = TRTC.createClient({
   mode: 'rtc',
   sdkAppId,
   userId,
   userSig,
 });
 
 Client
   .join({
     roomId: 111,
     role: 'anchor',
   })
   .then(async () => {
     console.log('进房成功');
   })
   .catch((error) => {
     console.error(`进房失败,请稍后再试${error}`);
   });
 
 </script>

访问页面和控制台,已经能够看到控制台打印出了进房成功

在这里插入图片描述
但是页面并没有呈现任何内容,这是因为此时我们还没有对本地的数据流进行采集、播放。加入如下代码

...
.then(async () => {
     console.log('进房成功');
     const localStream = TRTC.createStream({
      userId,
      audio: true,
      video: true,
      cameraId: (await TRTC.getCameras())[0].deviceId,
      microphoneId: (await TRTC.getMicrophones())[0].deviceId,
    });
    localStream.setVideoProfile('480p');
    await localStream.initialize();
    localStream.play('local');
    await Client.publish(localStream);
})
...

这里已经对本地的数据流进行了采集和播放,并指定了摄像头和麦克风,页面此时可以看到自己了,当然,为了不影响你们的学习兴趣,我自己马赛克了 😃

在这里插入图片描述
接下来让多个人进入一个房间。

在router 中变更路由

...
const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'custom',
    component: () => import('../views/video/index.vue'),
  },
  {
    path: '/room/:id',
    name: 'home',
    component: Index,
  },
  {
    path: '/myroom',
    name: 'myroom',
    component: () => import('../views/video/myroom.vue'),
  },
  {
    path: '/invite',
    name: 'invite',
    component: () => import('../views/Invite.vue'),
  },
];
...

我们在/video/index.vue中创建多个用户,并将每个用户的房间号设置为同样的111
在这里插入图片描述
在点击进入按钮的事件里,调用

const handlejoin = (o: List) => {
  store.$patch({
    sdkAppId: getParamKey('sdkAppId'),
    secretKey: getParamKey('secretKey'),
    userId: getParamKey('userId'),
    roomId: `${o.id}`,
  });
  const { id } = o;
  router.push(`/room/${id}`);
};

由于每次进入的房间号是一样的,所以所有用户都会进入同一个房间。然后点击离开,当前用户就会脱离房间了。

在这里插入图片描述

最后,代码放在github了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shopro商城 高级版 Fastadmin和Uniapp进行开发的多平台商城(微信公众号、微信小程序、H5网页、Android-App、IOS-App)

Shopro商城无加密的开源源码(可用于自营外包项目(多主体)、可用于外包定制开发项目) shopro 商城&#xff0c;一款基于 uni-app 的前端模板商城。目前适配了&#xff08;小程序apph5公众号&#xff09;。 主要功能&#xff1a;登录、注册、签到、富文本、分类、购物车、筛选、…

CI/CD docker compose 部署 humpback - single mode

最近想搭一搭个人服务器&#xff0c;其中有很多东西都是通过 docker 来管理&#xff0c;每次都手动输入命令比较麻烦&#xff0c;需要一个轻量级的容器管理工具来直观轻松的管理容器和镜像。于是便相中了 humpback。 Humpback humpback 相关的详细介绍请自助传送 架构 主要组…

【无线传感器】WSN 查找两个节点之间的最短路径并发送数据(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

前后端分离项目,vue+uni-app+php+mysql教室预约系统设计与实现(H5移动项目)

功能模块 【后台管理功能模块】 系统设置&#xff1a;设置关于我们、联系我们、加入我们、法律声明 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&#xff0c…

【力扣】787. K 站中转内最便宜的航班加权——有向图最短路径

前言 我感觉这题比较有代表性&#xff0c;所以记录一下&#xff0c;这题是加权有向图中求最短路径的问题。 题目 787. K 站中转内最便宜的航班 动态规划 假设有一条路径是[src, i, ..., j, dst]&#xff0c;解法一子问题的定义是[src, i, ..., j]&#xff0c;解法二子问题…

面经汇总--校招--北京顺丰同城

文章目录&#x1f525;1.一面&#x1f525;2.二面&#x1f525;3. 三面&#x1f525;4. 结果&#x1f525;1.一面 你对Spring aop的理解 面向切面编程&#xff0c;可以对某个方法前后加入自己想执行的方法函数。底层是动态代理&#xff0c;默认jdk动态代理&#xff0c;没有实现…

Redis 通用命令(keys,help,mset,exists,expire,ttl,tab补全)

目录 1.help【command】 2.tab自动补全 3. KEYS pattern&#xff08;模板&#xff09;&#xff08;不建议再生产环境上使用&#xff09; 4.del 删除指定的key&#xff0c;value也会删除&#xff08;也可以批量删除&#xff09; 5.MSET&#xff08;批量插入键值对&#xf…

【C语言】反序加密(非文件)

《算法集训传送门》 &#x1f449;引言 铭记于心&#x1f389;✨&#x1f389;我唯一知道的&#xff0c;便是我一无所知&#x1f389;✨&#x1f389;&#x1f496; ❄️我们的算法之路❄️&#x1f496;众所周知&#xff0c;作为一名合格的程序员&#xff0c;算法 能力 是不可…

Python OpenCV实现鼠标绘制矩形框和多边形

Python OpenCV实现鼠标绘制矩形框和多边形 目录 Python OpenCV实现鼠标绘制矩形框和多边形 1. OpenCV鼠标事件操作说明 &#xff08;1&#xff09;setMouseCallback函数说明 &#xff08;2&#xff09;回调函数onMouse说明 &#xff08;3&#xff09;event 具体说明&…

Flutter高仿微信-第24篇-隐私政策

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; /*** 显示服务条款、隐私政策对话框*/ static void show…

如何修复老照片?这三个方法建议收藏

当你在图书馆查阅一些资料时&#xff0c;会发现里面有许多的老照片&#xff0c;通过这些老照片我们能大概了解到那个时期的建筑特色、人们的穿衣特色等等。但由于那个时候的照片只有黑白&#xff0c;再加上时间悠久&#xff0c;老照片已经过于模糊了&#xff0c;影响到我们进行…

线性回归的梯度下降法——机器学习

一、实验内容 理解单变量线性回归问题&#xff1b;理解最小二乘法&#xff1b;理解并掌握梯度下降法的数学原理&#xff1b;利用python对梯度下降法进行代码实现&#xff1b; 二、实验过程 1、算法思想 梯度下降法是一阶最优化算法。 要使用梯度下降法找到一个函数的局部极小值…

Docker学习(3)—— 将容器转化为新的镜像,并将新镜像发布到阿里云公共仓库或私有仓库

一. 将容器转化为镜像 使用docker pull命令从远程仓库下载的镜像为base镜像&#xff0c;只具有最小的内核。我们可以在base镜像上安装其他工具&#xff0c;将其生成为一个新的镜像。相当于可以在原始的基础镜像上一层一层添加。 例如&#xff1a;下载一个centos的镜像&#x…

kibana 操作elasticsearch索引

前言 使用kibana可以很方便的对es进行各种操作&#xff0c;比如创建索引&#xff0c;删除索引&#xff0c;查询文档等&#xff0c;本篇先演示如何基于kibana 对es的索引进行常见的操作。 环境准备 请提前安装好es和kibana&#xff0c;可以参考 docker搭建es kibana操作es索引…

进销存商城前几名的运营方法|三招提高微信商城用户黏性

你有没有感到奇怪&#xff0c;明明是差不多装修&#xff0c;为什么有的微信商城只能和用户做成“单次消费行为”&#xff0c;但有的微信商城能让用户在他家复购一次两次三次&#xff1f; 这其实都跟用户忠诚度有关。进入存量时代后&#xff0c;维护好老用户就成为门店经营不可…

如何配置 ESXi 主机管理网络?

配置 ESXi 主机管理网络 VMware ESXi管理网络提供ESXi主机和客户端之间的通信。在服务器上安装 ESXi 虚拟机监控程序后,将通过动态主机配置协议(DHCP)获得ESXi管理IP。你可能需要配置ESXi主机的静态管理IP和主机名。按照以下指南配置ESXi管理网络,以便你可以通过域名而不是…

Apache ShenYu ModifyResponse插件使用

Apache ShenYu网关使用手册1 介绍1.1 概念1.2 特性1.3 架构图2 运行2.1 运行先决条件2.1 本地运行3 插件使用3.1 ModifyResponse插件3.1.1 插件名称3.1.2 适用场景3.1.3 插件功能3.1.4 插件代码3.1.5 如何使用插件3.1.5.1 插件使用流程图3.1.5.2 接入SpringBoot应用改造3.1.5.3…

kali没有wlan0

kali没有wlan0解决方案 第一步ifconfig发现没有wlan0 使用wget下载无线设备 命令如下&#xff1a; wget https://mirror2.openwrt.org/sources/compat-wireless-2010-06-28.tar.bz2 3. 解压刚才下载的压缩包&#xff1a; tar -xjvf compat-wireless-2010-06-28.tar.bz2 进…

【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《Leetcode》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 CM11 链表分割 OR36 链表的回文结构 CM11 链表分割 链表分割_牛客题霸…

【Linux】线程概念与线程控制

认识线程 线程是一个执行流&#xff08;运行代码&#xff0c;处理数据&#xff09; ​ 1.操作系统使用pcb来描述一个程序的运行-------pcb就是进程 ​ 2.linux下通过pcb模拟实现线程&#xff0c;因此linux下的线程是一个轻量级进程 ​ 3.这个轻量级进程因为公用大部分进程资…