共享桌面,3分钟自己实现一个吧,还能听见麦克风声音哦

前言

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

效果演示和源码

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

deskShare.gif

思路


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

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

Screen Capture API - 屏幕捕捉API

MDN解释:

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

先看动态,再看代码:

desk1.gif

仅仅只需 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

MDN

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

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

实现

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

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

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

注册账号

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

创建应用

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

SDK下载

去这里下载 Agora SDK下载

分享者代码编写

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

  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完整的代码

分享桌面源码

小结

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

写在最后

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

参考引用

Web RTC
Screen Capture API
Media Devices
实现视频直播
s://developer.mozilla.org/en-US/docs/Web/API/MediaDevices)
实现视频直播
跑通示例项目

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

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

相关文章

LD3320语音模块开发以及未来拿到其他模块的开发方式

当我们拿到一块模块进行开发的时候&#xff0c;一定要拿到配套的使用手册&#xff0c;不然在短时间内根本下不了手 一、使用source Insight来阅读源码 1.建立文件夹 2. 在source Insight放入该文件 3.添加源码 4.解决Source Insight乱码的问题 5.让各个代码模块之间有关联 二、…

uni-app中页面生命周期与vue生命周期的执行顺序对比

应用生命周期 uni-app 支持如下应用生命周期函数&#xff1a; 函数名说明平台兼容onLaunch当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;&#xff0c;参数为应用启动参数&#xff0c;同 uni.getLaunchOptionsSync 的返回值onShow当 uni-app 启动&#x…

Python零基础从小白打怪升级中~~~~~~~Python面向对象(二)

第九节&#xff1a;Python面向对象——继承和多继承 一、继承 Python面向对象的继承指的是多个类之间的所属关系&#xff0c;即子类默认继承父类的所有属性和函数。 在Python中&#xff0c;所有类默认继承object类&#xff0c;object类是顶级类或基类&#xff1b; 1、单继承…

Linux - 线程

目录 一.Linux线程的概念 1.1什么是线程 1.2 线程的优点 1.3 线程的缺点 1.4 线程异常 1.5 线程用途 二. Linux进程VS线程 2.1 进程和线程 三. Linux线程控制 3.1 POSIX线程库 3.2 创建线程 3.3 进程ID和线程ID 3.4 线程ID及进程地址空间布局 3.5 线程终止 3.6 线…

实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例

传统Wi-Fi网络所有终端设备都需要直接与路由器相连&#xff0c;这使得Wi-Fi的覆盖区域受到路由器位置的限制&#xff0c;可接入终端设备的数量也受到路由器容量的限制。而乐鑫ESP-Mesh-Lite Wi-Fi组网方案&#xff0c;所有终端设备都可以与相邻设备连接&#xff0c;摆脱了对路由…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…

9.Hexo通过partial文件传值和改变CSS属性

partials 基本上是可以在自己的HTML文件或.ejs文件中定义网站中不同组件的方法 如果想要为网站定义一个标头&#xff0c;这个标头将会很好地出现在网站的每个页面上 用partials可以创建一个.ejs文件&#xff0c;可以将该标头的所有代码存储在该文件中&#xff0c;然后当想要在…

记一次奇妙的某个edu渗透测试

前话&#xff1a; 对登录方法的轻视造成一系列的漏洞出现&#xff0c;对接口确实鉴权造成大量的信息泄露。从小程序到web端网址的奇妙的测试就此开始。&#xff08;文章厚码&#xff0c;请见谅&#xff09; 1. 寻找到目标站点的小程序 进入登录发现只需要姓名加学工号就能成功…

BIT-6-C语言文件操作(C语言进阶)

本章重点 为什么使用文件什么是文件文件的打开和关闭文件的顺序读写文件的随机读写文本文件和二进制文件文件读取结束的判定 文件缓冲区 1. 为什么使用文件 我们前面学习结构体时&#xff0c;写了通讯录的程序&#xff0c;当通讯录运行起来的时候&#xff0c;可以给通讯录中增…

程序员应该遵守的 10 个编程原则

程序员应该遵守的编程原则 程序员拥有一个较好的编程原则能使他的编程能力有大幅的提升&#xff0c;可以使其开发出维护性高、缺陷更少的代码。以下内容梳理自StactOverflow的一个问题&#xff1a;编程时你最先考虑的准则是什么&#xff1f; 目录 Toggle KISS&#xff08;Keep …

PaddleOCR训练自己模型(2)----参数配置及训练

一、介绍 paddleocr分为文字定位(Det)和文字识别(Rec)两个部分 二、定位模型训练 &#xff08;1&#xff09;Det预训练模型下载&#xff1a;https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_train.tar &#xff08;2&#xff09;下载完之后&#xff0c;…

基于zookeeper安装Kafka集群

操作系统&#xff1a;centOS 9 Stream&#xff0c;6台&#xff0c;基于vmware虚拟机创建 准备工作 确认系统环境&#xff1a; 确保所有服务器已安装了最新更新。安装Java Development Kit (JDK) 8或更高版本&#xff0c;因为ZooKeeper和Kafka都是基于Java开发的。例如&#x…

【探索人工智能】我与讯飞星火认知大模型的对话

文章目录 讯飞星火认知大模型的地址概要讯飞星火认知大模型的发展历程讯飞星火认知大模型的主页利用讯飞星火大模型解决一些基本的数学问题讯飞星火认知大模型与OpenAI,ChatGPT没有关系&#xff01;让讯飞星火认知大模型编写传奇代码hello world小结 讯飞星火认知大模型的地址 …

文献速递:深度学习胰腺癌诊断--胰腺癌在CT扫描中通过深度学习检测:一项全国性的基于人群的研究

Title 题目 Pancreatic Cancer Detection on CT Scans with Deep Learning: A Nationwide Population-based Study 胰腺癌在CT扫描中通过深度学习检测&#xff1a;一项全国性的基于人群的研究 01 文献速递介绍 胰腺癌&#xff08;PC&#xff09;的五年生存率是所有癌症中…

【蓝桥杯嵌入式】串口通信与RTC时钟

【蓝桥杯嵌入式】串口通信与RTC时钟 串口通信cubemx配置串口通信程序设计 RTC时钟cubemx配置程序设计 串口通信 cubemx配置 打开串口通信&#xff0c;并配置波特率为9600 打开串口中断 重定义串口接收与发送引脚&#xff0c;默认是PC4&#xff0c;PC5&#xff0c;需要改为P…

运输问题的中转或者转运问题

1、这类问题&#xff0c;不好理解&#xff0c;做个笔记&#xff0c;记录一下。 2、可以参考一下&#xff1a; https://blog.csdn.net/YUNCHOUSHUO/article/details/121660675?spm1001.2014.3001.5506 这个csdn写的还是不错的&#xff0c;推荐。 或者&#xff0c;可以参考 …

网络安全学习路线-超详细

零基础小白&#xff0c;到就业&#xff01;入门到入土的网安学习路线&#xff01; 在各大平台搜的网安学习路线都太粗略了。。。。看不下去了&#xff01; 建议的学习顺序&#xff1a; 一、网络安全学习普法&#xff08;心里有个数&#xff0c;要进去坐几年&#xff01;&#x…

OpenAI宣布GPT-4-Turbo全面升级,GPT-4 Turbo 新增视觉理解能力,可同时处理文本和图像信息

OpenAI宣布GPT-4-Turbo全面升级&#xff0c;GPT-4 Turbo with Vision新增视觉理解能力&#xff0c;可同时处理文本和图像信息&#xff0c;极大简化了开发流程。 OpenAI宣布GPT-4 Turbo全面升级&#xff01;根据官方说法&#xff0c;这一波 GPT 的升级包括&#xff1a; 更长的上…

VSCode安装配置使用教程(最新版超详细保姆级含插件)一文就够了

前言 Visual Studio Code 是一个轻量级功能强大的源代码编辑器&#xff0c;支持语法高亮、代码自动补全&#xff08;又称 IntelliSense&#xff09;、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和 Git 版本控制系统。适用于 Windows、macOS 和 Linux。它内置了对…

Open3D 体素滤波(30)

Open3D 体素滤波(30) 一、算法介绍二、算法实现1.代码2.效果一、算法介绍 体素滤波(Voxel Grid Filtering)是一种常用的点云滤波算法,用于对点云数据进行下采样(降低数据密度)以及去除噪声。该算法将点云数据划分为规则的体素网格,然后在每个体素中选择一个代表性点作为…