Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何将录制的DOM转成视频文件

如何将录制的DOM转成视频文件

作者头像
前端小鑫同学
发布于 2022-12-26 02:09:33
发布于 2022-12-26 02:09:33
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~

背景说明:

     最近有在看GitHub上的rrweb项目,确实是一款DOM录制的神器,在使用文档中提供了很多我们会用到的场景和对应的示例,我们今天来看一下其中一个场景《转换为视频》,虽然rrweb直接回放的效果最佳但还是会遇到需要转为视频进行存储的要求,通过查看rrweb提供的rrvideo项目后决定写一下整个转换的过程,大致的流程图如下:

环境配置:

安装FFmpeg:用于将逐帧的图片数据转换为视频。

安装puppeteer:用于在后台加载网页。

安装rrweb-player:用于播放rrweb录制的events数据。

使用puppeteer打开空白页面:

获取browser对象实例:browser = await puppeteer.launch({ headless: true });

打开新页签:page = await browser.newPage();&await page.goto("about:blank");

通过page.exposeFunction在window对象上挂载开始和结束录制的调用函数;

将需要播放的events数据使用page.setContent()加载进页面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
  browser = await puppeteer.launch({ headless: true });
  page = await browser.newPage();
  await page.goto("about:blank");
  // 扩展启动录制函数
  await page.exposeFunction("onReplayStart", async () => {
    await startReplay();
  });
  // 扩展结束录制函数
  await page.exposeFunction("onReplayFinish", async () => {
    await finishReplay();
  });
  // 读取原数据
  const events = JSON.parse(
    fs.readFileSync(path.resolve(process.cwd(), _input), "utf-8")
  );
  await page.setContent(getHtml(events));
} catch (error) {
  console.log("openPage:", error);
}
组装最简支持rrweb-player播放的DOM结构:

获取安装到node_modules内的rrweb-player包的内容,便于插入到DOM中;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 获取rrweb-player的脚本插入到DOM中
const rrwebScriptPath = path.resolve(
  require.resolve("rrweb-player"),
  "../../dist/index.js"
);
const rrwebStylePath = path.resolve(rrwebScriptPath, "../style.css");
const rrwebRaw = fs.readFileSync(rrwebScriptPath, "utf-8");
const rrwebStyle = fs.readFileSync(rrwebStylePath, "utf-8");

拼装满足rrweb-player播放的基础DOM,其中在replayer.play()函数执行前开启录制并在监听到播放完成后结束录制:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const html = `
        <html>
          <head>
              <style>${rrwebStyle}</style>
          </head>
          <body>
            <script>
              ${rrwebRaw};
              /*<!--*/
              const events = ${JSON.stringify(events).replace(
                /<\/script>/g,
                "<\\/script>"
              )};
              /*-->*/
              window.replayer = new rrwebPlayer({
                target: document.body,
                props: {
                  events,
                  showController: false,
                },
              });
              window.onReplayStart();
              window.replayer.play();
              window.replayer.addEventListener('finish', () => {
                  window.onReplayFinish()
              });
            </script>
          </body>
        </html>
        `;
通过puppeteer提供的screenshot函数定时截屏获取数据流:

获取到需要录制的元素对象:const wrapperEl = await page.$(".replayer-wrapper");

通过screenshot来截取当前帧的画面,返回数据类型为二进制数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const buffer = await wrapperEl?.screenshot({
  encoding: "binary",
});
执行ffmpeg命令并将截屏数据输入到ffmpeg进程:

我们使用NodeJs提供的spawn函数来执行FFmpeg命令,此处未配置环境变量而直接引用的FFmpeg的绝对路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ffmpegProcess = spawn("D:\\ffmpeg\\bin\\ffmpeg", [
    // fps
    "-framerate",
    "15",
    // input
    "-f",
    "image2pipe",
    "-i",
    "-",
    // output
    "-y",
    _output,
  ]);

将截图得到的二进制数据写入ffmpegProcess进程的标准输入流中:ffmpegProcess.stdin.write(buffer);

总结说明:
  1. 以上就是对rrvideo流程拆解一些关键点说明,完整代码在GitHub
  2. rrvideo还提供了常用的一些配置项来便于调整视频的尺寸等信息。
  3. puppeteer是继上次做自动生成骨架屏后的第二次使用。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
在 SCF 中运行 Puppeteer
Puppeteer 是一个 Node.js 库, 提供了一组封装良好的接口, 使你可以通过 DevTools 协议控制 Chrome. 本文介绍如何在 SCF 中使用 Puppeteer.
ritchiechen
2019/04/05
6.7K10
在 SCF 中运行 Puppeteer
利用docker部署puppeteer
puppeteer可以使用Network.emulateNetworkConditions和Emulation.setCPUThrottlingRate轻松地模拟不同的网络请求。但是,这一个CPU节流器只是相对延缓你的CPU,在不同的机器我们会得到不同的结果,所以我们必须要统一一个环境来运行我们的程序。
2014v
2019/11/20
3.4K0
【dart-skeleton,逻辑篇】自动生成骨架屏项目
承接上篇【dart-skeleton】自动生成骨架屏项目内容,这一篇主要来说一下第二块内容逻辑篇。
前端小鑫同学
2022/12/26
2830
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
在CSDN写了大概140篇文章,一直都是0阅读量,仿佛石沉大海,在掘金能能频频上热搜的文章,在CSDN一点反馈都没有,所以跟文章质量关系不大,主要是曝光量,后面调研一下,发现情况如下
linwu
2023/08/08
5690
我写了一个自动化脚本涨粉,从0阅读到接近100粉丝
「nodejs + docker + github pages 」 定制自己的 「今日头条」
在闲暇之余,我们经常会逛各种社区,逛掘金看技术软文,逛虎扑看今日赛事,逛头条看热门时事,逛 91……
null仔
2020/02/28
1.2K0
「nodejs + docker + github pages 」 定制自己的 「今日头条」
puppeteer爬虫教程_python爬虫入门最好书籍
为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。
全栈程序员站长
2022/09/19
1.9K0
puppeteer爬虫教程_python爬虫入门最好书籍
Puppeteer已经取代PhantomJs
记得前几年,我们通常会用PhantomJs做一下自动化测试,或者为了SEO优化,会用它对SPA页面进行预渲染,现在有更好的Puppeteer来代替它的工作了,性能更好,使用起来也更加方便,Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,用来模拟 Chrome 浏览器的运行。
javascript.shop
2020/04/10
6.4K0
Puppeteer实现选择性截图
截图的代码很简单,比如如果我想实现对百度搜索框部分截图怎么做呢,查询page.screenshot api 可以看到其api说明中包含clip 选项,用于设置截图的x,y,width,hegiht.通过查看元素可以看到搜索框部分的form id 为 form 。
Jerremy
2018/05/09
8.5K5
Puppeteer实现选择性截图
用 Puppeteer 把繁琐工作给自动化了,太爽啦!
这意味着如果文中有几十张图片,那我需要单独把这几十张图片保存到本地,然后光标定位到对应位置,点击上传图片,把图片插进去。
神说要有光zxg
2023/08/29
5110
用 Puppeteer 把繁琐工作给自动化了,太爽啦!
Puppeteer 入门与实战
Puppeteer 是 Chrome开发团队2017年发布的一个 Node.js包,提供了一组用来操纵Chrome的API,通俗来说就是一个Headless Chrome浏览器,这Headless Chrome也可以配置成有UI的 。利用Puppeteer可以做到爬取页面数据,页面截屏或者生成PDF文件,前端自动化测试(模拟输入/点击/键盘行为)以及捕获站点的时间线,分析网站性能问题。
2020labs小助手
2020/08/13
2.1K0
前端人的爬虫工具【Puppeteer】
Puppeteer 是 Chrome 开发团队在 2017 年发布的一个 Node.js 包,同时还有 Headless Chrome。用来模拟 Chrome 浏览器的运行。它提供了高级API来通过 DevTools 协议控制无头 Chrome 或 Chromium ,它也可以配置为使用完整(非无头)Chrome 或 Chromium。
Snine
2022/02/11
3.5K0
前端人的爬虫工具【Puppeteer】
puppeteer使用指南-入门
上篇文章讲解了如何安装puppeteer,这篇文章我们通过几个小案例来了解一下puppeteer的常用api的使用方法。
挥刀北上
2021/02/02
2.7K0
puppeteer使用指南-入门
使用puppeteer抓取受限网站
不要相信前端是安全的,今天简单验证一下(但是希望大家支持正版,支持原作者,毕竟写书不易)。
Jerremy
2018/05/03
3.1K0
使用puppeteer抓取受限网站
puppeteer使用指南-安装
poppeteer是控制Chromium浏览器的一个js库,Chromium是谷歌开发的一款开源浏览器,与Chrome不同Chrome是不开源的,Chromium提供了很过供开发者使用的接口,开发者可以根据自己的需要通过相应的语言去驱动Chromium完成自己的项目,而puppeteer是用js语言开发的驱动Chromium的库,其他的语言如python使用python版本的puppeteer来驱动Chromium。
挥刀北上
2021/02/01
4.3K0
puppeteer使用指南-安装
Puppeteer 初探之前端自动化测试
导语: Most things that you can do manually in the browser can be done using Puppeteer! 初识puppeteer pup
QQ音乐前端团队
2017/09/25
13.2K6
Puppeteer 初探之前端自动化测试
自动化 Web 性能分析之 Puppeteer 爬虫实践
通过上篇文章《自动化 Web 性能优化分析方案》的分享想必大家对“百策系统”有了初步的了解。本文将向大家介绍自动化性能分析使用的核心库——Puppeteer,并结合页面登录场景,介绍 Puppeteer 在百策系统中的应用。
政采云前端团队
2019/12/20
3.5K0
自动化 Web 性能分析之 Puppeteer 爬虫实践
Puppeteer 入门指引
Puppeteer 是一个 Node library,提供了一套完整的通过 DevTools 协议操纵 Chrome 或 Chromium 的 API。Puppeteer 默认以 无头(headless) 的方式运行, 也可以使用 GUI 的方式运行 Chrome 和 Chromium。
MudOnTire
2022/03/22
1.7K0
Puppeteer 入门指引
使用 Node.js 生成方便传播的图片
本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)
soulteary
2019/09/29
1.5K0
Headless Chrome:服务端渲染JS站点的一个方案【中篇】【翻译】防止重新渲染优化
接上篇 防止重新渲染 其实说不对客户端代码做任何修改是忽悠人的。在我们的Express 应用中,通过Puppteer加载页面,提供给客户端响应,但是这个过程是有一些问题的。 js脚本在服务端的Headless Chrome 中执行过一次,但是等浏览器拿到真正的结果后,并不会阻止js再次执行,所以这种情况下js会执行两次(客户端一次,服务端一次) 针对我们的例子,我们可以简单的修复一下,我们需要告诉页面,需要的html已经生成了,不需要再次生成了,所以我们可以简单的检测<ul id="posts"> 是
Jerremy
2018/06/13
1.2K0
实现一个 Code Pen:(六)云函数生成网页缩略图
在前面的文章中,我们已经实现了编辑器的功能,并且数据可以保存到云数据库,接下来我们需要生成缩略图的功能,目前掘金的的 code pen 还没有缩略图的功能,这是否是一个挑战呢?
狂奔滴小马
2022/05/14
1.5K0
实现一个 Code Pen:(六)云函数生成网页缩略图
相关推荐
在 SCF 中运行 Puppeteer
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验