在日常生活中,音视频通话、直播及视频会议等诸多音视频场景已经很常见,腾讯发布的 实时音视频(Tencent RTC) 产品,基于腾讯多年来在网络与音视频技术上的深度积累,让开发者能快速上手搭建高质量的音视频场景。
腾讯产品的音视频场景大家都很熟悉,有QQ、微信的语音和视频通话,腾讯会议等,TRTC 基于深厚的技术积累,为开发者提供了多平台的成熟方案,包括 Android、iOS、Web、小程序、Windows 及 Mac OS 等平台,我体验了一下 Demo(线上 Demo 地址),感觉还不错,小程序端的解决方案还做了主流手机牌子的适配,试用下 Web 端的 TRTC sdk 看看。
得先去 TRTC 开通地址 创建应用,TRTC 是基于腾讯云提供服务的,需要先创建 TRTC 应用,才能使用服务,应用的 SDKAppID 和 SecretKey 是服务认证凭据,本地跑 demo 得用这个;
创建应用送 10000 分钟免费体验,足够体验下了;具体的用量,在控制台里也能看到:

TRTC 提供的方案,分为无 UI 集成 和 有 UI 集成 两大类,先体验下「无 UI 方案」;
我之前只接触过 WebRTC 的一些简单场景,先拉取了 TRTC Web 的 Demo,本地跑下;
腾讯提供了完善的跑通 demo 文档,跟着走就行;
我的运行环境是:
> node -v
v16.16.0
> nvm -v
8.16.0
# chrome 版本
107.0.0.0
仓库里一共是五个 Demo:
base-js
base-react-next
quick-demo-js
quick-demo-vue2-js
quick-demo-vue3-ts
最基础的 demo,用 script 方式引入了 TRTC sdk;
在/base-js/js/debug/GenerateTestUserSig.js里,填入自己 TRTC 应用的 SDKAppID 和 SecretKey ,在根目录下启动 http 环境,我是用的 live-server 启动的:
# base-js根目录
live-server --port=8899
启动后,访问http://127.0.0.1:8899,先会有个音视频设备检测,像 WebRTC 应用也会先调 getUserMedia 来检测设备环境,同意权限即可 ;
然后是「进入房间」:

用户名和房间号都是随机生成的,点击「进入房间」,就进到了房间页:

可以多个用户进入同一房间,输入相同的房间号,点击「进入房间」;
界面简单,流程蛮清晰的,看了下代码,认证 TRTC 服务时,需要 userSig 验签:
// GenerateTestUserSig.js
const generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME);
const userSig = generator.genTestUserSig(userID);
通过 SDKAppID 、SecretKey 和 expireTime 哈希加密,生成签名,加了层认证,加强了腾讯云服务防护;
这个项目也是用live-server启动,相较 base-js 界面和功能丰富一些,有步骤引导,SDKAppID 和 secretKey 放到了界面表单上填;

摄像头和麦也可以切换;
可以对照着每个按钮的绑定函数,看下trtc-js-sdk 的逻辑,比如「进入房间」按钮:
async function joinRoom() {
initParams()
client = new Client({sdkAppId, userId, roomId, secretKey, cameraId, microphoneId});
try {
await client.join();
reportSuccessEvent('joinRoom', sdkAppId)
publish();
refreshLink()
invite.style.display = 'flex';
} catch (error) {
console.log('joinRoom error', error);
reportFailedEvent({
name: 'joinRoom', // 必填
sdkAppId,
roomId,
error
})
}
}
可以看到,流程是:
TRTC.createClient 方法,创建 client 对象;join 方法,向 Server 端发送“进房”请求initLocalStream 方法,该方法调用了 TRTC 的 createStream等 API,进行音视频的初始化,从摄像头及麦克风中采集音视频流;publish方法,发布本地流;stream-added事件,收到事件后,通过stream-subscribed订阅;代码在 js/client.js里: installEventHandlers() {
// ...
this.client.on('stream-added', this.handleStreamAdded.bind(this));
this.client.on('stream-subscribed', this.handleStreamSubscribed.bind(this));
// ...
}
play方法,在页面上播放音视频,play方法接受一个 div 元素 ID 作为参数,SDK 内部会在该 div 元素下自动创建相应的音视频标签并在其上播放音视频。 handleStreamSubscribed(event) {
const remoteStream = event.stream;
const id = remoteStream.getId();
const userId = remoteStream.getUserId();
const remoteId = `remote-${id}`;
// ...
// 调用 play 方法
remoteStream.play(remoteId).then(() => {
console.log(`play remote stream success: [${userId}] ID: ${id} type: ${remoteStream.getType()}`);
addSuccessLog(`RemoteStream play success: [${userId}]`);
})
.catch((error) => {
console.error('play remote stream failed', error);
addFailedLog(`RemoteStream play failed: [${userId}]`);
});
// ...
}
本地流的播放也是一样调用 play方法;
这是视频会议场景里的常用功能:

对方访问此链接的话,页面提示:

界面是在 /quick-demo-js/invite/index.html;
这也是常用功能了;

大家用的是 Vue 的话,建议直接看 quick-demo-vue2-js 和 quick-demo-vue3-js 这俩项目,更容易上手 sdk 逻辑;
进入对应目录下后,直接 npm start就行,会先安装依赖,再启动开发环境;
界面、功能和 quick-demo-js 一样, 两个 Vue 项目都用了aegis-web-sdk来监控 sdk 运行情况;
这个是用 next.js 写的,界面和功能又丰富了些,房主可以控制其他人的声音和视频画面显示;
SDKAppID 和 SecretKey 是在src/app/config.js里配置;
安装及启动
# 安装依赖
yarn
# 运行开发环境
yarn run dev

“进阶应用” 里的功能挺多,像Canvas、video捕获等,也是常见的场景,Canvas 可能是用 drawImage进行拍照截图;

美颜和水印试了下,有点卡,这类功能应该比较吃性能吧;
实时语音识别的话,需要开通相关语音产品服务;腾讯会议的转录、纪要生成之类的,可能都用的到,包括 youtube 的实时 AI 字幕啥的,应该也是应用到了实时语音识别的技术; 不过腾讯会议这个好像要收费了吧,sigh。
总之,TRTC 的 sdk 还是蛮好用的。
TRTC 也提供了含 UI 的解决方案,也是覆盖了多平台多场景,比如 Web 端多人视频会议组件 TUIRoom Web,对照着文档,自己起了个项目,引入 TUIRoom 组件试了试;
npm create vite@latest TUIRoom-try -- --template vue-ts
cd TUIRoom-try
npm install
# 运行所需
npm install -D sass typescript unplugin-auto-import unplugin-vue-components @types/node @types/events @types/js-cookie vue-router
# 开发所需
npm install -S pinia element-plus vue-i18n tim-js-sdk trtc-js-sdk tsignaling rtc-beauty-plugin events mitt axios js-cookie
import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import {ElementPlusResolver} from 'unplugin-vue-components/resolvers';
import path from 'path';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver({
importStyle: 'sass',
})],
}),
],
css: {
preprocessorOptions: {
scss: {
// ...
additionalData: `
@use "./src/TUIRoom/assets/style/element.scss" as *;
`,
},
},
},
base: process.env.NODE_ENV === 'production' ? './' : '/',
resolve: {
// 别名配置
alias: {
'@': path.join(__dirname, 'src')
}
},
server: {
open: true,
port:12223
},
})
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index';
import { createPinia } from 'pinia';
import VueI18n from '@/TUIRoom/locales/index';
import 'element-plus/theme-chalk/el-message.css';
import 'element-plus/theme-chalk/el-message-box.css';
createApp(App).use(router).use(createPinia()).use(VueI18n).mount('#app')
先 clone TUIRoom Web 项目:
git clone git@github.com:tencentyun/TUIRoom.git
项目蛮大的,因为包含多平台的 demo 工程, web、iOS、安卓都有;网络环境不够好的话,建议用 GitHub Desktop 或者下载 zip 文件;
clone 下来后,复制 TUIRoom/Web/vue3/src/TUIRoom 文件夹到自己的 TUIRoom-try/src/ 目录下;
创建页面组件及路由
在 src/pages 下新增了 home.vue 和 room.vue 两个页面,分别是“ 首页” 和 “房间页”,创建对应路由 /home 和 /room;
首页
开发环境启动后,访问 http://localhost:12223/,也就是「首页」 ;
官方文档里也写了:因 TUIRoom 按需引入 element-plus 组件,会导致开发环境路由页面第一次加载时反应较慢,等待 element-plus 按需加载完成即可正常使用。element-plus 按需加载不会影响打包之后的页面加载。 😢 确实要等很久;
首页弄了个表单,里面填入 SDKAppID 、 SecretKey 和 userId,下方是 TUIRoom 里的 StreamPreview 本地音视频流预览组件;

点击「创建房间」按钮,进行房间创建:
TUIRoomCore.login(sdkAppId, userId, userSig)方法,“创建房间” 和 “进入房间” 都需要调用 login 方法;getRoomParam() ,获取音视频设备信息,将其与 action 参数( createRoom / enterRoom ) 及 房间模式(我这里写死为 FreeSpeech )组合成房间信息,也存入 sessionStorage 里;router.replace({
path: '/room',
query: {
roomId,
},
});

<Room
ref="TUIRoomRef"
@on-log-out="handleLogOut"
@on-create-room="onCreateRoom"
@on-enter-room="onEnterRoom"
@on-exit-room="onExitRoom"
@on-destroy-room="onDestroyRoom"
@on-kick-off="onKickOff"
></Room>
核心的建房和进房,是通过 sessionStorage 中存储的 action 来判断:
if (action === 'createRoom') {
// 主持人创建房间
await TUIRoomRef.value?.createRoom(Number(roomId), roomMode, roomParam);
} else if (action === 'enterRoom') {
// 进房
await TUIRoomRef.value?.enterRoom(Number(roomId), roomParam);
}
点击功能栏里的「邀请成员」,生成邀请链接 :

访问该链接,home 页检测到有 roomId query,就切成「进入房间」,

填入userId后,进入房间

包括成员管理:

被踢:

总结:
TUIRoom 组件上手还是不难,项目中可以考虑直接用 UI 组件,不过建房的响应速度不如无 UI 方案直接调 sdk 来的快。
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url
西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
一、RIPV2协议简介 RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对
♥️作者:白日参商🤵♂️个人主页:白日参商主页♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!「想体验ChatGPT中文聊天?」那快进来,你用不上算我输项目场景:项目条件一、那就开始吧1、安装ChatGPT-Desktop2、OpenAPI设置二、使用实例恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!恭喜你!!!配置成功了!!!API和URL都是博主免费提供给大家的!!!🎈🎈加油!加油!加油!加油🎈欢迎评论💬点赞👍🏻收藏📂加关注+!项目场景:近几个月可以说ChatGPT是火得一
目录1.1访问Cisco路由器的方法1.1.1通过Console口访问路由器1.1.2通过Telnet访问路由器1.1.3终端访问服务器1.2终端访问服务器配置命令汇总1.1访问Cisco路由器的方法 路由器没有键盘和鼠标,要初始化路由器需要把计算机的串口和路由器的Console口进行连接。访问Cisco路由器的方法还有Telnet、WebBrowser和网络管理软件(如CiscoWorks)等,本节讨论前2种。1.1.1通过Console口访问路由器 计算机的串口和路由器的Console口是通过反转线(Rollover)进行连接的,反转线的一端接在路由器的Console口上,另一
一、什么是web项目ui自动化测试?通过测试工具模拟人为操控浏览器,使软件按照测试人员的预定计划自动执行测试的一种方式,可以完成许多手工测试无法完成或者不易实现的繁琐工作。正确使用自动化测试,可以更全面的对软件进行测试,从而提高软件质量进而缩短迭代周期。二、构建测试用例的“九部曲”(一)创建流程包划分功能模块日常测试活动中,都会根据功能模块进行拆分,所以在设计器中我们可以通过创建流程包的方式来拆分需要测试的功能模块,如下图中操作创建一个电脑流程包并且取名为对应的功能模块名称,如果有多个功能模块就创建多个对应的流程包,实在RPA设计器有易用的图形可视化界面,方便管理较多的功能模块。(二)在流程包