点击上方蓝字,关注趣谈前端

原文: https://juejin.cn/post/6993133406565449736

作者: 云的世界

专栏: 前端SSD系列

前言

前端一些有意思的内容,旨在3-10分钟里, 500-1000字,有所获,又不为所累。
共享桌面程序,哇,高大尚耶!其实不然,让我带你3分钟实现桌面共享程序,还能听到对面说话哦。

效果演示和源码

两个Tab标签,一个是分享者,一个是观众。 顺便问一下,怎么把声音保存到gif图里面去?

思路

用户1 ==> Screen Capture API  ===>  Web RTC  ===>  User2 Video 标签播放

其核心 Screen Capture API[1] + WebRTC API[2], 我们一起来了解一波。

Screen Capture API[3] - 屏幕捕捉API

MDN解释:

屏幕捕获API,对现有的媒体捕获和流API进行了补充,让用户选择一个屏幕或屏幕的一部分(如一个窗口)作为媒体流进行捕获。然后,该流可以被记录或通过网络与他人共享。

先看动态,再看代码:

仅仅只需 10 余行代码,就可以把桌面展示在网页面里面是不是很酷。

    <video id="deskVideo" autoplay controls></video><script>(async function captureDesk() {deskVideo.srcObject = await navigator.mediaDevices.getDisplayMedia({video: {cursor: "always"},audio: false});})();</script>

Web RTC[4]

MDN

WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。

我们明白其是点对点传输技术,解决传输问题就行。

实现

遵循SSD系列的准则:3-10分钟里, 500-1000字,有所获,又不为所累。我自行实现,字数会超,而且还要有中转服务器。罢了,借助声网吧。

声网 agora[5], 为什么是他,因为他一个月免费 10000 分钟, 做测试和个人使用是完全够了的。其底层的基本原理上面已经说过了,核心就是 Screen Capture API[6] + Web RTC[7]。

当然声网还支持摄像头,麦克风等等其他流的推送,摄像头和麦克风是 MediaDevices[8]相关的内容不做过多的解释。

注册账号

声网管理台登录或者注册[9],链接地址已给,自行操作即可。

创建应用

详情参见 跑通示例项目[10], 里面有详细的步骤教你创建应用,以及获得AppIDToken

SDK下载

去这里下载 Agora SDK下载[11]

分享者代码编写

这里有一个参数理解一下:

  1. appId:应用ID

  2. channel: 渠道,你可以理解为房间

  3. token:票证

  4. uid: 用户ID

  5. role: 用户角色,有主播和观众两种

核心代码:

async function startBasicLive() {rtc.client = AgoraRTC.createClient({ mode: "live", codec: "vp8" }); // 初始化客户端rtc.client.setClientRole(options.role);  // 设置角色const uid = await rtc.client.join(options.appId, options.channel, options.token, options.uid);       rtc.localAudioTrack = await AgoraRTC.createMicrophoneAudioTrack(); // 麦克风rtc.localVideoTrack = await AgoraRTC.createScreenVideoTrack();  // 桌面// 将这些音视频轨道对象发布到频道中。await rtc.client.publish([rtc.localAudioTrack, rtc.localVideoTrack]);console.log("publish success!");
}
btnShareDesk.onclick = startBasicLive; // 注册点击事件

观众端代码编写

核心代码

async function startBasicLive() {rtc.client = AgoraRTC.createClient({ mode: "live", codec: "vp8" });rtc.client.setClientRole(options.role);rtc.client.on("user-published", async (user, mediaType) => {// 开始订阅远端用户。await rtc.client.subscribe(user, mediaType);console.log("subscribe success", mediaType);// 表示本次订阅的是视频。if (mediaType === "video") {// 订阅完成后,从 `user` 中获取远端视频轨道对象。const remoteVideoTrack = user.videoTrack;// 动态插入一个 DIV 节点作为播放远端视频轨道的容器。const playerContainer = document.createElement("div");// 给这个 DIV 节点指定一个 ID,这里指定的是远端用户的 UID。playerContainer.id = user.uid.toString();playerContainer.style.width = "640px";playerContainer.style.height = "480px";document.body.append(playerContainer);// 订阅完成,播放远端音视频。// 传入 DIV 节点,让 SDK 在这个节点下创建相应的播放器播放远端视频。remoteVideoTrack.play(playerContainer);}// 表示本次订阅的是音频。if (mediaType === "audio") {// 订阅完成后,从 `user` 中获取远端音频轨道对象。const remoteAudioTrack = user.audioTrack;// 播放音频因为不会有画面,不需要提供 DOM 元素的信息。remoteAudioTrack.play();}});   const uid = await rtc.client.join(options.appId, options.channel, options.token, null);console.log("uid", uid);
}

demo完整的代码

源码地址: https://github.com/xiangwenhu/juejinBlogsCodes/tree/master/shareYourDesktop

小结

是不是很简单,一切都看起来没那么难,这样,你才容易入坑啊。

写在最后

写作不易,你的一赞一评就是我前行的最大动力。

参考引用

Web RTC[12]
Screen Capture API[13]
Media Devices[14]
实现视频直播[15]
跑通示例项目[16]

从零搭建全栈可视化大屏制作平台V6.Dooring

从零设计可视化大屏搭建引擎

Dooring可视化搭建平台数据源设计剖析

可视化搭建的一些思考和实践

基于Koa + React + TS从零开发全栈文档编辑器

点个在看你最好看

前端:3分钟实现一个共享桌面,还能听见麦克风声音哦相关推荐

  1. 笔记本开机只有电池灯亮还可以听见工作声音就是屏幕也没有反应是怎么回事

    如果外接显示器能够有信号输出的话,只能证明显卡或芯片组显示功能是没有问题的,并不能说明液晶屏是否出了故障.请外接显示器开机进入操作系统后,按住Fn功能键再按切屏键来转换输出设备试一试,如果切了几次液晶 ...

  2. 旧饭新炒,论Citrix共享桌面的最佳实践(2)

    HI, 唐工 我非常高兴看到你的反馈.对于你的问题我说几点我的看法. Q1:跟用户使用微软的远程桌面直接登录到XenApp 服务器去访问没啥区别 A:从表现上看是一样的.但是要注意的是,XA走的是IC ...

  3. 前端基础知识点-每天一个基本知识点(100+个前端小知识,你是否都知道?)

    文章目录 前言 第一回合 一.知识点:cookie(21/09/06) 二.知识点:节流和防抖(21/09/07) 三.知识点:var和let以及const(21/09/08) 四:知识点:深拷贝和浅 ...

  4. mysql connection闪退重连_玩家排位巅峰赛开局闪退,重连失败,10分钟后一个提示让他懵了...

    #游戏圈中的春节# 王者荣耀排位赛460是经常的事情,不过闪退还是比较少见的,玩家排位巅峰赛开局闪退,重新登录游戏之后,重连一直失败,10分钟后一个提示让他懵了. 460的情况大家都经历过,这是很多原 ...

  5. windows远程登录 ubuntu Linux 系统及互连共享桌面

    预备工作 #开启防火墙端口 sudo ufw allow 3389 #安装ssh sudo apt-get install openssh-server 一.windows直连Ubuntu16.04共 ...

  6. [译] 用 Redis 和 Python 构建一个共享单车的 app

    原文地址:Build a bikesharing app with Redis and Python 原文作者:Tague Griffith 译文出自:掘金翻译计划 本文永久链接:github.com ...

  7. 设置VLC播放器进行RTSP推流桌面(共享桌面)

    设置VLC播放器进行RTSP推流桌面(共享桌面) 一.推流与拉流概念 二.设置推流端 三.设置拉流端(播放端) VLC官网:https://www.videolan.org/ 一.推流与拉流概念 首先 ...

  8. 几分钟上线一个项目文档网站,这款开源神器实在太香了!

    之前在搭建mall项目的文档网站时,使用过不少工具,比如说Docsify.VuePress.Hexo.语雀等.对比了一下,要论使用简单.上线快捷还是Docsify,几分钟上线一个网站也不是问题,今天我 ...

  9. 几分钟上线一个项目文档网站,这款开源神器实在太香了~

    之前在搭建mall项目的文档网站时,使用过不少工具,比如说Docsify.VuePress.Hexo.语雀等.对比了一下,要论使用简单.上线快捷还是Docsify,几分钟上线一个网站也不是问题,今天我 ...

最新文章

  1. 关于从页面中获取用户控件中的其它控件(如DropDownList)事件的方法
  2. 多线程基础-常用线程方法(三)
  3. SQL Express自动备份
  4. P3515-[POI2011]Lightning Conductor【整体二分,决策单调性】
  5. Ubuntu环境搭建
  6. 【mybatis】mybatis中 if test=等于的条件怎么写
  7. 创新元旦新年PSD分层海报,新气象开启!
  8. 软件设计师中级-数据结构及算法应用
  9. 完全免费的Windows代码签名证书(大神勿喷)
  10. GitHub 标星 6W:口吐芬芳终端助手
  11. 计算机桌面ie图标无法删除,Win10系统中桌面ie图标无法删除如何解决
  12. Android持久化存储——(包含操作SQLite数据库)
  13. 美通企业周刊 | 中国全球化品牌50强榜单发布;酩帝诗威士忌拍出近21万美元天价...
  14. window7调用计算机,教你查看win7系统电脑使用记录的具体方法
  15. SpringBoot 统一功能处理
  16. 大学两年时间的一些感悟
  17. libselinux conflicts with fakesystemd-1-17.el7.centos.noarch
  18. it项目经理岗位职责(转)
  19. Tips:一个字符占几个字节?
  20. Bootstrap导航nav

热门文章

  1. uni-app 打开第三方程序
  2. 在线运行java测试
  3. pg2.OperationalError: could not connect to server: Connection timed out (0x0000274C/10060)
  4. 现在开房都不需要在前台办理入住了?刺激
  5. 添加域后如何将域用户加入本地管理员组
  6. 主动雷达和被动雷达的区别
  7. 疑难杂症共济失调怎么治疗恢复?
  8. 【可穿戴算法】-进阶-心率变异性分析
  9. 软件设计师-备考知识点总结
  10. Layui表格排序例子