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

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

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

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 实现了一个音视频下载的功能。

相关推荐
我是华为OD~HR~栗栗呀39 分钟前
华为OD-23届-测试面经
java·前端·c++·python·华为od·华为·面试
β添砖java2 小时前
vivo响应式官网
前端·css·html·1024程序员节
web打印社区7 小时前
使用React如何静默打印页面:完整的前端打印解决方案
前端·javascript·vue.js·react.js·pdf·1024程序员节
喜欢踢足球的老罗7 小时前
[特殊字符] PM2 入门实战:从 0 到线上托管 React SPA
前端·react.js·前端框架
小光学长7 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
Baklib梅梅8 小时前
探码科技再获“专精特新”认定:Baklib引领AI内容管理新方向
前端·ruby on rails·前端框架·ruby
南方以南_8 小时前
Chrome开发者工具
前端·chrome
YiHanXii8 小时前
this 输出题
前端·javascript·1024程序员节
楊无好8 小时前
React中ref
前端·react.js
维他命Coco8 小时前
js常见开发学习
javascript