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

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

前言


关于【SSD系列】:


前端一些有意思的内容,旨在3-10分钟里, 500-1000字,有所获,又不为所累。


共享桌面程序,哇,高大尚耶!其实不然,让我带你3分钟实现桌面共享程序,还能听到对面说话哦。


效果演示和源码


两个Tab标签,一个是分享者,一个是观众。分享桌面源码


顺便问一下,怎么把声音保存到gif图里面去????


1.JPG


思路


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


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


Screen Capture API - 屏幕捕捉API


MDN解释:


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


先看动态,再看代码:


2.JPG


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


分享桌面源码


小结


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


写在最后


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





相关文章
|
监控 负载均衡 安全
服务治理:构建健壮的微服务生态系统的关键
在微服务架构中,服务治理是确保服务可靠性、可伸缩性和高可用性的关键组成部分。本博客将深入探讨服务治理的概念、重要性以及如何有效地在微服务生态系统中实施它。
|
SQL Web App开发 XML
广联达OA漏洞合集(信息泄露+SQL注入+文件上传)
广联达Linkworks办公OA存在信息泄露,攻击者可通过此漏洞获取账号密码登录后台,造成其他影响。
2093 1
|
网络安全 开发工具 对象存储
OSS 的C++ SDK编译安装指南
OSS 的C++ SDK编译安装指南
OSS 的C++ SDK编译安装指南
|
存储 网络协议 定位技术
高德地图开放平台IP地位接口使用说明
高德地图开放平台IP地位接口使用说明
2373 0
|
开发者
冷门但好看的 VSCode 主题推荐
笔者在使用VSCode进行开发的过程中喜欢没事就逛一逛插件商店里的颜色主题,也看过国内外许多论坛上面的颜色主题推荐,不知不觉已经下载了超过一百个的颜色主题。这篇文章总结了我用过的最舒服的一些颜色主题。
7666 0
冷门但好看的 VSCode 主题推荐
|
Python
自动迁移百度网盘文件到阿里网盘,告别小水管
自动迁移百度网盘文件到阿里网盘,告别小水管
16910 1
自动迁移百度网盘文件到阿里网盘,告别小水管
|
Oracle 关系型数据库 数据库
如何利用 Docker 安装 Oracle 数据库
【2月更文挑战第14天】
1872 0
|
消息中间件 大数据 Kafka
kafka线上问题:rebalance
小米探讨了Kafka消费组重平衡问题,这是大数据领域的一大挑战,特别是在大规模集群中。重平衡因组成员增减、主题数量变化或分区数变化触发,可能使Kafka短暂不可用,影响TPS。解决办法包括调整超时时间、心跳频率和拉取间隔以减少重平衡频率和影响。了解触发原因和机制,以及实施优化策略,对于提升Kafka集群的稳定性和性能至关重要。
592 0
kafka线上问题:rebalance
|
11月前
|
存储 关系型数据库 MySQL
docker中查看数据卷信息
【10月更文挑战第11天】
467 2
|
12月前
|
负载均衡 安全 Java
微服务 Gateway 使用详解
网关(Gateway)是连接不同网络并进行数据转发的关键组件。在互联网中,路由器常作为默认网关;在现代操作系统中,网关指本地网络上转发数据包的设备。Spring Cloud Gateway是一款基于Spring Framework的API网关,具备反向代理、高性能、负载均衡、安全控制、限流熔断、日志监控等功能。通过简单配置即可实现请求路由和转发,适用于微服务架构中的集中控制、解耦客户端与服务、自动服务发现等场景,提升系统安全性与可扩展性。
1405 4