简单的学习下 JavaScript 录屏API

news2024/9/29 3:25:33

ddc87acdb6f885aacbeab531e8c296f2.jpeg

学习如何使用这个简单易用的API进行屏幕共享、屏幕录制等操作。尽管需要对JavaScript有一定的了解,但我相信你已经具备了这方面的知识。

1、开始录制

让我们创建一个按钮:

8e6da146049c1f1df6812586338a3656.jpeg

<button id="recording-toggle">Start recording</button>

JavaScript 代码

var RECORDING_ONGOING = false;
var recordingToggle = document.getElementById("recording-toggle"); // The button

recordingToggle.addEventListener("click", function(){
    RECORDING_ONGOING = !RECORDING_ONGOING; // Start / Stop recording
    if(RECORDING_ONGOING){
        recordingToggle.innerHTML = "Stop Recording";
        startRecording(); // Start the recording
    } else {
        recordingToggle.innerHTML = "Start Recording";
        stopRecording(); // Stop screen recording
    }
});

看起来这里似乎有很多内容,但实际上,我们只是在按钮上添加了一个事件监听器,以便启动和停止录制,并相应地更改文本。

编写录制核心代码

在函数之前,声明3个全局变量(在函数外部)。

var blob, mediaRecorder = null;
var chunks = [];

现在,让我们开始屏幕录制。

async function startRecording(){
    var stream =  await navigator.mediaDevices.getDisplayMedia(
      {video: {mediaSource: "screen"}, audio: true}
    );

    deviceRecorder = new deviceRecorder(stream, {mimeType: "video/webm"});
}

我们从用户的屏幕创建一个媒体流。媒体记录器有一个 mimeType,它是您所希望的输出文件的类型。

您可以在这里关于 mimeType 的信息。

Edge 浏览器支持 video/webm mimeType。该文件扩展名为 .webm。您可以使用以下方式检查浏览器是否支持某个 mimeType:

console.log(MediaRecorder.isTypeSupported("video/webm"))
console.log(MediaRecorder.isTypeSupported("video/mp4"))
console.log(MediaRecorder.isTypeSupported("video/mp4;codecs=avc1"))

在这篇文章中,我将使用 Webm,但您可以根据需要更改 mimeType。

在 startRecording 函数中添加几行代码:

deviceRecorder.ondataavailable = (e) => {
        if(e.data.size > 0){
             chunks.push(e.data);
        }
    }
    deviceRecorder.onstop = () => {
        chunks = [];
    }
    deviceRecorder.start(250)

每当我们有数据时,我们将其添加到之前定义的 chunks 数组中。当我们停止录制时,我们将调用 stopRecording() 函数。

停止录制

function stopRecording(){
    var filename = window.prompt("File name", "video"); // Ask the file name

    deviceRecorder.stop(); // Stopping the recording
    blob = new Blob(chunks, {type: "video/webm"})
    chunks = [] // Resetting the data chunks
    var dataDownloadUrl = URL.createObjectURL(blob);

    // Downloadin it onto the user's device
    let a = document.createElement('a')
    a.href = dataDownloadUrl;
    a.download = `${filename}.webm`
    a.click()
    
    URL.revokeObjectURL(dataDownloadUrl)
}

这就是在 JavaScript 中进行屏幕录制的简单方法。如果您想要使用 mp4 或其他格式,您将需要使用 API 进行转换或自行处理。

066d32148c4b864b841c5c0c16c9e886.jpeg

结束

在本文中,我们介绍了使用 JavaScript 进行屏幕录制的简单方法。通过使用浏览器提供的媒体记录器 API,我们可以轻松地捕捉用户屏幕的内容并创建录屏文件。无论是进行教学演示、演讲稿录制还是创建应用程序演示视频,屏幕录制都是一个非常有用的工具。您可以根据需要选择不同的输出文件类型,并根据自己的需求进行扩展和定制。我希望本文对您理解和使用 JavaScript 的录屏 API 有所帮助。

谢谢您阅读本文,如果您对其他 JavaScript API 和功能感兴趣,请继续关注我的系列文章。在接下来的文章中,我将继续介绍更多有趣和实用的内容,如通知、浏览器历史记录以及音频和视频录制等。请留意我的更新,获取最新的技术资讯和教程。

希望您喜欢这篇文章,如果您有任何问题或意见,请随时与我联系。再次感谢您的阅读!

由于文章内容篇幅有限,今天的内容就分享到这里,文章结尾,我想提醒您,文章的创作不易,如果您喜欢我的分享,请别忘了点赞和转发,让更多有需要的人看到。同时,如果您想获取更多前端技术的知识,欢迎关注我,您的支持将是我分享最大的动力。我会持续输出更多内容,敬请期待。

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

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

相关文章

BUUCTF变异凯撒

根据题目可以得知&#xff0c;这道题使用的是凯撒密码 凯撒密码&#xff0c;是一种位移加密方式&#xff0c;只对26个字母进行位移替换加密&#xff0c;规则简单&#xff0c;容易破解。 但是根据题目下发的文件看来&#xff0c;出现了关于除字母以外的字符&#xff0c;结合题目…

综合评价算法 | Matlab实现基于变异系数法的综合评价算法

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 综合评价算法 | Matlab实现基于变异系数法的综合评价算法 研究内容 变异系数法是根据统计学方法计算得出系统各指标变化程度的方法,是一种客观赋权法。根据该方法变化差异较大的指标权重较大,变化差异较…

【C++ 实现】图论概念,最小生成树,单/多源最短路径实现

文章目录 数据结构表示图最小生成树KruskalPrim 最短路径DijkstraBellman-Ford算法多源最短路径&#xff1a;FloydWarshall 总结 数据结构表示图 首先节点的存取&#xff0c;V是节点key&#xff0c;vector<pair<V,V>> map;其实已经能表达一个图了&#xff0c;但是…

MWCS 2023,到底有些啥?(上篇)

大家好&#xff0c;MWCS 2023&#xff08;世界移动通信大会上海展&#xff09;已经结束了。按照老规矩&#xff0c;我来给大家汇报一下现场情况。 █ 展会总结 今年是MWC在中国的第十届&#xff0c;也是疫情管控解除后的第一届。从总体情况来看&#xff0c;人气非常火爆。展区人…

ElasticSearch - 根据经纬度,简单搜索指定距离范围内的数据

ES的地图检索方式 ES支持的地图检索方式有以下几种&#xff1b; geo_distance geo_bounding_box geo_polygon 1、geo_distance&#xff1a;直线距离检索&#xff0c;如给定点A&#xff0c;要求返回地图上距离点A三千米的商家&#xff08;点外卖场景&#xff09; 2、查找索引…

下半年就该这么干!

阅读本文大概需要 0.99 分钟。 周末一般不更新&#xff0c;不过今天有点特殊。 是这样的&#xff0c;前几天不是通知说我们 7 月 8 日会在杭州举办线下大会么&#xff1f;完了之后发现后台很多私信问怎么参加的&#xff0c;这才想起我这个公众号还没发让大家进预约群的入口。。…

前端使用mysql记录。以本机作为服务器,安装mySql。Dbeaver的基本使用

安装 Mac 上如何安装Mysql&#xff1f; Mac 上如何安装Mysql&#xff1f; Mysql 配置 在mac终端打开文件&#xff1a;vi ~/.bash_profile 加入语句&#xff1a;PATH$PATH:/usr/local/mysql/bin 使配置的语句生效&#xff1a;source ~/.bash_profile 使用命令行 sudo vi /et…

【读书笔记】《月亮与六便士》- [英] 威廉·萨默塞特·毛姆 - 1919年出版

不停的阅读&#xff0c;然后形成自己的知识体系。 2023.07.03 读 一直听说毛姆的大名&#xff0c;却一直没有拜读。记得《小王子》中有读者提到这本书&#xff0c;看了眼作者竟然发现是毛姆。那么毫不犹豫的&#xff0c;赶紧拜读一番。 文章目录 作家榜推荐词第一章第二章第三…

Spring核心原理解析

1.Bean的生命周期底层原理 AppConfig package com.zhouyu;import com.zhouyu.service.OrderService; import org.springframework.context.annotation.*;ComponentScan("com.zhouyu") public class AppConfig {Beanpublic OrderService orderService1(){return new…

微机实验一:认识实验系统和联机通讯实验

实验目的 讲清楚进行本实验后要学到的知识、掌握的数据结构及共定义和农示方法&#xff0c;讲清楚所采用的算法 wrTPL-486微机原理及接口技术数学实验手统的操u)孰秀TPC-480联机集闯开发调试故件的操作环境3)3俩文丝计体机的基阻成和4、存储器并有接新i的置(了解岗单汇海语谢设…

Nginx【location指令、虚拟主机的分类、Nginx支持三种类型的虚拟主机配置 】(三)-全面详解(学习总结---从入门到深化)

目录 Nginx配置指令详解_location指令 虚拟主机的分类 Nginx支持三种类型的虚拟主机配置 Nginx配置指令详解_location指令 配置location块 语法&#xff1a; URL // http://ip:port/ location [ | ~ | ~* | ^~] uri {... } 示例1 没有修饰符 表示&#xff1a;必须以指…

UE5 MetaHuman SDK插件的使用【二、聊天机器人】

目录 制作&#xff1a; 流程制作【相对复杂但逻辑清楚】&#xff1a; 快速制作【有个函数把上面的流程全部合在了一起&#xff0c;只需要用一个函数即可】 3个结构体的参数 combo后面的逻辑&#xff1a; 效果&#xff1a; ​编辑 代码 在前面的文章中&#xff0c;我们创…

geoserver发布arcgis server离线瓦片

1.使用tif文件也可以发布服务&#xff0c;但是我下载的tif文件发布的服务总数模糊不清&#xff0c;原因可能是地图比例尺问题。 2.仔细研究&#xff0c;发现下载的arcgis server瓦片都是高清的&#xff0c;于是想到直接加载arcgis瓦片&#xff0c;这样图片/坐标系之间问题都完…

Python3 实例(四) | 菜鸟教程(二十二)

目录 一、Python 堆排序 二、Python 计数排序 三、Python 希尔排序 四、Python 拓扑排序 五、Python 简单的银行系统 一、Python 堆排序 &#xff08;一&#xff09;堆排序&#xff08;Heapsort&#xff09;是指利用堆这种数据结构所设计的一种排序算法。 &#xff08;二…

【JUC-6】AQS介绍,基于AQS实现自己的锁

什么是AQS AbstractQueuedSynchronizer(抽象队列同步器&#xff0c;简称AQS)出现在JDK 1.5中。AQS是很多同步器的基础框架&#xff0c;比如ReentrantLock、CountDownLatch和Semaphore等都是基于AQS实现的。除此之外&#xff0c;我们还可以基于AQS&#xff0c;定制出我们所需要…

关于LiveData全面详解(附事件总线)

前言&#xff1a;缤纷色彩闪出的美丽 是因它没有 分开每种色彩 前言 MVVM 架构模式中&#xff0c;ViewModel 是不会持有宿主的信息&#xff0c;业务逻辑在 ViewModels 层中完成&#xff0c;而不是在 Activities 或 Fragments 中。LiveData 在里面担任数据驱动的作用&#xff1…

ElementPlus的Collapse 折叠面板问题

我也不明白为什么会报这个错误&#xff0c;把关于ts的代码改成js的就可以了。。 ERROR in ./src/views/Home.vue?vue&typescript&langts&setuptrue (./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/views/Home.vue?vue&typescript&…

大厂经验,基于资产健康度量化的小米数据治理实践

摘要&#xff1a;随着小米公司各项业务的快速发展&#xff0c;数据中的商业价值也愈发突显。而与此同时&#xff0c;各业务团队在数据查询、分析等方面的压力同样正在剧增。小米大数据团队用大数据管理大数据&#xff0c;从存储、计算、规范、质量、安全五方面着手治理&#xf…

java swing实现JTextField文本框的输入提示补全功能,以登陆界面自动提示补全用户账号为例,自动填充账号密码

前言 如果您想了解更多的java项目功能源码,请订阅我的专栏: java项目源码合集100+ 一、实现的功能 在使用java做界面实现输入功能的时候,使用了JTextField文本输入组件,希望能够根据用户的输入,自动提示,之后用户可以选择提示的内容作为文本框的输入内容,效果如下: 当…

Java中的阻塞队列使用以及详解

文章目录 一、Queue接口1. 常见方法以及功能(不具有阻塞队列特性)1.1 add(E e)1.2. offer():1.3. remove()1.4. poll()1.5. element()1.6. peek() 2. add和offer对比&#xff1a;3. remove和poll对比&#xff1a;4. element#peek方法对比&#xff1a; 二、BlockingQueue阻塞队列…