如何正确使用 MediaRecorder 录制 Vanta.js 动画背景

冬伟同学_6456

冬伟同学_6456

2026-11-09

603人浏览

原创

如何正确使用 MediaRecorder 录制 Vanta.js 动画背景

本文详解为何 captureStream() 录制 Vanta.js 动画时返回空 Blob,并提供完整可运行的修复方案:移除冗余 canvas、精准选取 Vanta 自动生成的 canvas、合理设置 MediaRecorder 参数及 DOM 结构。

本文详解为何 `capturestream()` 录制 vanta.js 动画时返回空 blob,并提供完整可运行的修复方案:移除冗余 canvas、精准选取 vanta 自动生成的 canvas、合理设置 mediarecorder 参数及 dom 结构。

在使用 Vanta.js 创建动态 3D 背景(如云朵、网格、噪声等)并配合 MediaRecorder 录制 canvas 动画时,一个常见却隐蔽的问题是:录制生成的 .webm 文件体积为 0 字节,Blob 对象为空。根本原因在于 DOM 中存在多个 元素,而 JavaScript 错误地获取了未被 Vanta 初始化的空白 canvas。

Vanta.js 在调用 VANTA.CLOUDS("#ele") 时,会自动向目标容器(如 #ele)内部动态插入一个专属的 元素,用于渲染 Three.js 动画。若你在 HTML 中预先声明了 ,该元素将与 Vanta 创建的 canvas 并存。此时 document.querySelector("canvas") 默认匹配第一个(即你手动写的空 canvas),其尚未被 Three.js 上下文初始化,captureStream() 虽能成功调用,但流中无有效帧数据,最终导致 chunks 数组为空,Blob 为空。

✅ 正确做法是:

  • 彻底移除手动声明的 标签,避免干扰;
  • 确保 Vanta 容器(如 #ele)是纯净的 div,由 Vanta 自主注入 canvas;
  • 使用 setTimeout 或 requestAnimationFrame 等方式确保 Vanta 初始化完成后再启动录制(推荐延迟 100–300ms);
  • captureStream() 的帧率建议设为 60(而非 30),以更好匹配 Vanta 的默认渲染节奏;
  • MediaRecorder.start() 可传入 timeslice(毫秒),但非必需;更稳妥的是显式调用 stop();
  • 注意 Blob 的 MIME 类型应简化为 "video/webm"(Chrome/Firefox 均兼容),避免硬编码 codecs=h264(WebM 实际常用 VP8/VP9,h264 多用于 MP4)。

以下是精简、健壮、可直接运行的完整示例:

Expanso yaml-to-json
Expanso yaml-to-json

使用 Expanso Edge 管道将 YAML 输入转换为 JSON 格式。

下载


  <meta charset="utf-8"><title>Vanta + MediaRecorder Recording</title><!-- ✅ 移除所有手动 canvas --><div style="display: flex; flex-direction: column; height: 100vh; margin: 0;">
    <div id="link" style="padding: 12px; font-size: 14px;"></div>
    <div id="ele" style="flex: 1; margin: 0;"></div>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r134/three.min.js"></script><script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.clouds.min.js"></script><script>
    // ✅ 初始化 Vanta(异步,内部创建 canvas)
    const vanta = VANTA.CLOUDS({
      el: "#ele",
      mouseControls: true,
      touchControls: true,
      gyroControls: false,
      minHeight: 200,
      minWidth: 200,
      scale: 1.0,
      backgroundColor: 0x000000
    });

    // ✅ 等待 Vanta 渲染一帧后开始录制(更可靠 than fixed timeout)
    const startRecording = () => {
      // 确保 canvas 已挂载且有 WebGL context
      const canvas = document.querySelector("#ele canvas");
      if (!canvas) {
        console.error("Vanta canvas not found. Retry after init.");
        return;
      }

      const chunks = [];
      const stream = canvas.captureStream(60); // 60fps 匹配 Vanta 渲染
      const mediaRecorder = new MediaRecorder(stream, {
        mimeType: "video/webm"
      });

      mediaRecorder.ondataavailable = (e) => {
        if (e.data.size > 0) chunks.push(e.data);
      };

      mediaRecorder.onstop = () => {
        if (chunks.length === 0) {
          alert("⚠️ No video data captured — check canvas rendering & permissions.");
          return;
        }
        const blob = new Blob(chunks, { type: "video/webm" });
        downloadVideo(blob);
      };

      mediaRecorder.start();
      setTimeout(() => mediaRecorder.stop(), 2000); // 录制 2 秒
    };

    // ✅ 推荐:在 Vanta ready 后触发(Vanta v0.5.25+ 支持 onReady 回调)
    if (vanta && typeof vanta.destroy === 'function') {
      // 模拟等待:实际项目中可监听 vanta.ready 或使用 Promise 包装
      setTimeout(startRecording, 300);
    } else {
      startRecording();
    }

    const downloadVideo = (blob) => {
      const url = URL.createObjectURL(blob);
      const a = document.createElement("a");
      a.href = url;
      a.download = "vanta-recording.webm";
      a.textContent = "✅ Click to download recording (2s)";
      a.style.display = "block";
      a.style.margin = "8px 0";

      const span = document.createElement("span");
      span.innerHTML = `<small>Preview URL: <code>${url}`;
      span.style.display = "block";
      span.style.fontSize = "12px";
      span.style.color = "#666";

      const linkDiv = document.getElementById("link");
      linkDiv.innerHTML = "";
      linkDiv.append(a, span);
    };
  </script>

⚠️ 关键注意事项:

  • 不要在本地文件系统(file:// 协议)中运行:MediaRecorder 在部分浏览器中对 file:// 限制严格,可能导致 captureStream() 返回空流或报错。请使用本地服务器(如 npx serve、VS Code Live Server 或 Python http.server)部署测试。
  • 权限与上下文:确保页面处于活跃标签页,且 canvas 渲染未被暂停(如切换到其他 tab 时,Three.js 可能节流)。
  • 错误处理:务必检查 chunks.length 和 e.data.size,避免静默失败。
  • 性能提示:长时间录制高帧率动画可能产生较大文件,生产环境建议添加进度反馈与取消机制。

通过以上调整,即可稳定捕获 Vanta.js 动画为高质量 WebM 视频,解决 blob is null 的核心痛点。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

4731

6

HTML与HTML5的区别
HTML与HTML5的区别

HTML与HTML5的区别:1、html5支持矢量图形,html本身不支持;2、html5中可临时存储数据,html不行;3、html5新增了许多控件;4、html本身不支持音频和视频,html5支持;5、html无法处理不准确的语法,html5能够处理等等。想了解更多HTML与HTML5的相关内容,可以阅读本专题下面的文章。

2024.03.06

8428

6

html5从入门到精通汇总
html5从入门到精通汇总

想系统掌握HTML5开发?本合集精选全网优质学习资源,涵盖免费教程、实战项目、视频课程与权威电子书,从基础语法到高级特性(Canvas、本地存储、响应式布局等)一应俱全,适合零基础小白到进阶开发者,助你高效入门并精通HTML5前端开发。

2025.12.30

874

19

html5新老标签汇总
html5新老标签汇总

HTML5在2026年持续优化网页语义化与交互体验,不仅引入了如<header>、<nav>、<article>、<section>、<aside>、<footer>等结构化标签,还新增了<video>、<audio>、<canvas>、<figure>、<time>、<mark>等增强多媒体与

2025.12.30

734

12

html5空格代码怎么写
html5空格代码怎么写

在HTML5中,空格不能直接通过键盘空格键实现,需使用特定代码。本合集详解常用空格写法:&nbsp;(不间断空格)、&ensp;(半个中文空格)、&emsp;(一个中文空格)及CSS的white-space属性等方法,帮助开发者精准控制页面排版,避免因空格失效导致布局错乱,适用于新手入门与实战参考。

2025.12.30

413

8

html5怎么做网站教程
html5怎么做网站教程

想从零开始学做网站?这份《HTML5怎么做网站教程》合集专为新手打造!涵盖HTML5基础语法、页面结构搭建、表单与多媒体嵌入、响应式布局及与CSS3/JavaScript协同开发等核心内容。无需编程基础,手把手教你用纯HTML5创建美观、兼容、移动端友好的现代网页。附实战案例+代码模板,快速上手,轻松迈出Web开发第一步!

2025.12.31

541

12

HTML5建模教程
HTML5建模教程

想快速掌握HTML5模板搭建?本合集汇集实用HTML5建模教程,从零基础入门到实战开发全覆盖!内容涵盖响应式布局、语义化标签、Canvas绘图、表单验证及移动端适配等核心技能,提供可直接复用的模板结构与代码示例。无需复杂配置,助你高效构建现代网页,轻松上手前端开发!

2025.12.31

378

7

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2025.12.31

641

20

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

2025.12.31

578

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习