炸裂,用JS创建一个录屏功能
作者:Lokender Singh
译者:前端小智
来源:dev
有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。我们正在招聘,年薪:25-60万+奖金,有兴趣的可以点我了解详情。
本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。
OBS studio很酷,但 JavaScript 更酷,现在,我们用 JavaScript 创建自己的录屏功能。
首先,创建一个HTML文件,包含记录按钮和一个播放标签,内容如下:
Parcel Sandbox - 锐客网
然后在创建
index.js
,监听按钮的点击:let btn = document.querySelector(".record-btn");
btn.addEventListener("click", function () {
console.log("hello");
});
在浏览器中打开 html文件,点击按钮,我们可以在控制台看到打印的
hello
。
文章图片
现在把打印去掉,换成如下的内容:
let btn = document.querySelector(".record-btn");
btn.addEventListener("click", async function () {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true
});
});
现在点击按钮,会弹出屏幕选择框:

文章图片
因为,我现在用的是两个屏幕,所以会出现两个选择。
现在你可能认为选择一个屏幕,然后点击分享,就开始录制了。非也,这个比我们想象中的复杂点。我们要使用 MediaRecorder 来录制我们的视频。
let btn = document.querySelector(".record-btn")btn.addEventListener("click", async function () {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true
})// 需要更好的浏览器支持
const mime = MediaRecorder.isTypeSupported("video/webm;
codecs=vp9")
? "video/webm;
codecs=vp9"
: "video/webm"
let mediaRecorder = new MediaRecorder(stream, {
mimeType: mime
})
// 必须手动启动
mediaRecorder.start()
})
当我们的屏幕被录制下来时,
mediaRecorder
会给我们提供分块的数据,我们需要将这些数据存储在一个变量中。let btn = document.querySelector(".record-btn")btn.addEventListener("click", async function () {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true
})// 需要更好的浏览器支持
const mime = MediaRecorder.isTypeSupported("video/webm;
codecs=vp9")
? "video/webm;
codecs=vp9"
: "video/webm"
let mediaRecorder = new MediaRecorder(stream, {
mimeType: mime
})let chunks = []
mediaRecorder.addEventListener('dataavailable', function(e) {
chunks.push(e.data)
})// 必须手动启动
mediaRecorder.start()
})
【炸裂,用JS创建一个录屏功能】现在,当我们点击停止共享按钮时,希望在我们的
video
元素中播放录制的视频,可以这么做:let btn = document.querySelector(".record-btn")btn.addEventListener("click", async function () {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true
})// 需要更好的浏览器支持
const mime = MediaRecorder.isTypeSupported("video/webm;
codecs=vp9")
? "video/webm;
codecs=vp9"
: "video/webm"
let mediaRecorder = new MediaRecorder(stream, {
mimeType: mime
})let chunks = []
mediaRecorder.addEventListener('dataavailable', function(e) {
chunks.push(e.data)
})mediaRecorder.addEventListener('stop', function(){
let blob = new Blob(chunks, {
type: chunks[0].type
})let video = document.querySelector(".video")
video.src = https://www.it610.com/article/URL.createObjectURL(blob)
})// 必须手动启动
mediaRecorder.start()
})
现在基本就可以完成了,可以在润色下,如自动下载录制的视频,可以这么做:
let btn = document.querySelector(".record-btn")btn.addEventListener("click", async function () {
let stream = await navigator.mediaDevices.getDisplayMedia({
video: true
})// 需要更好的浏览器支持
const mime = MediaRecorder.isTypeSupported("video/webm;
codecs=vp9")
? "video/webm;
codecs=vp9"
: "video/webm"
let mediaRecorder = new MediaRecorder(stream, {
mimeType: mime
})let chunks = []
mediaRecorder.addEventListener('dataavailable', function(e) {
chunks.push(e.data)
})mediaRecorder.addEventListener('stop', function(){
let blob = new Blob(chunks, {
type: chunks[0].type
})
let url = URL.createObjectURL(blob)let video = document.querySelector("video")
video.src = https://www.it610.com/article/urllet a = document.createElement('a')
a.href = https://www.it610.com/article/url
a.download ='video.webm'
a.click()
})// 必须手动启动
mediaRecorder.start()
})
现在,最基本的一个录制功能就完善了,动手来试试吧!!
~完,我是刷碗智,励志等退休后,要回家摆地摊的人,我们下期见!
代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug。
原文:https://dev.to/0shuvo0/lets-c...
交流 文章每周持续更新,可以微信搜索【大迁世界 】第一时间阅读,回复【福利】有多份前端视频等着你,本文 GitHub https://github.com/qq449245884/xiaozhi 已经收录,欢迎Star。

文章图片
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。