纯前端实现录屏并保存视频到本地

使用场景: 面试时共享屏幕,录制面试过程,分享网站页面的内容

如何实现浏览器录屏功能?

1.了解 mediaDevices 对象

mediaDevices 是 Navigator 只读属性,返回一个 MediaDevices 对象,该对象可提供对相机和麦克风等媒体输入设备的连接访问,也包括屏幕共享。

图1 mediaDevices对象展示

其中 getDisplayMedia 方法可以获取用户的屏幕分享或屏幕捕获流,通常用于制作屏幕录像或视频会议等应用。

可通过如下代码请求获取包含视频流的媒体许可:

xml 复制代码
<body>
<button>共享屏幕</button> 
<script> 
    const button = document.querySelector("button"); 
    let stream
    button.addEventListener("click", async () => {
    stream = await navigator.mediaDevices.getDisplayMedia({ video: true }) }); 
</script>
</body>

可以将其存储在名为 stream 的变量中,以便后续使用。

这个流可以用于在网页上显示屏幕共享或进行其他媒体处理操作。

2.了解 MediaRecorder API

MediaRecorder 是一个 Web API,用于在浏览器中进行媒体录制,主要用于录制音频和视频。它允许你从不同的来源,例如麦克风、摄像头、屏幕共享或其他媒体元素,捕获音频和视频数据,并将其保存为文件或进行实时流媒体传输。通过调用 MediaRecorder.isTypeSupported() 方法会判断其 MIME 格式能否被客户端录制。

它支持的类型主要有以下几种方式:

ini 复制代码
const types = [ 
    "video/webm",  "audio/webm",  "video/webm;codecs=vp8",  "video/mpeg",  
    "video/webm;codecs=daala",  "video/webm;codecs=h264",  "audio/webm;codecs=opus"
];

3.结合 mediaDevices 对象和 MedieRecorder API 实现录屏并保存视频到本地

首先通过1.中方式获取屏幕分享或屏幕捕获流

然后判断当前浏览器是否支持对应MIME类型

// 举例

ini 复制代码
const mime = MediaRecorder.isTypeSupported("video/webm;codecs=h264") ? 
"video/webm;codecs=h264" : "video/webm";
// 之后以两者为基础通过new关键字实例化一个 MediaRecorder 对象
const mediaRecorder = new MediaRecorder( stream , { mimeType: mime });
// 可以通过监听 mediaRecorder 的 dataavailable 和 stop 事件来进行屏幕分享或屏幕捕获流的下载
// 如下代码所示:
const chunks = [];
mediaRecorder.addEventListener("dataavailable", (e)=> { 
    chunks.push(e.data)
});
mediaRecorder.addEventListener("stop", () => { 
    const blob = new Blob(chunks, { type: chunks[0].type }); 
    const url = URL.createObjectURL(blob); 
    const a = document.createElement("a"); 
    a.hidden = true;
    a.target = _blank;
    a.href = url; 
    a.download = "video.webm"; 
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
});
mediaRecorder.start();

通过如上代码即可实现录屏并保存视频到本地

接下来分析一下dataavailable 和 stop 事件

① dataavailable 事件:当 MediaRecorder 有可用的音频/视频数据块时,它会触发此事件。在这里,每当数据可用时,将数据块(e.data)添加到 chunks 数组中。这是为了在录制完成后将这些数据块合并成一个完整的媒体文件。

② stop 事件:当录制停止时,MediaRecorder 会触发此事件。

综上,实现了一个屏幕录制功能,并且通过 MediaRecorder API 实现了一个音视频下载的功能。

相关推荐
AlienZHOU4 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
Captaincc8 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师9 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen9 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒10 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow10 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81810 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007810 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明10 小时前
第 6 章 组件进阶
前端·vue.js
江华森10 小时前
HTTP请求的完整过程详解:从DNS解析到TCP挥手的微秒级实战分析
前端