tsParticles Export Video 插件指南:将粒子动画导出为 WebM/MP4 视频
tsParticles Export Video 插件指南将粒子动画导出为 WebM/MP4 视频【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticlestsparticles/plugin-export-video是 tsParticles 官方提供的视频导出插件它基于浏览器原生MediaRecorder与HTMLCanvasElement.captureStream()能力把正在运行的粒子动画画布实时录制为视频 Blob从而无需安装任何额外依赖即可将粒子效果、彩带爆炸或烟花动画保存成 WebM、OGG、MP4 等格式。阅读本文后你将掌握该插件的完整接入流程CDN 与模块化两种方式、可配置参数fps、duration、mimeType以及它在引擎中的导出调用链与浏览器兼容性边界。插件是什么职责与架构定位tsparticles/plugin-export-video是 tsParticles 众多导出插件之一它本身不修改粒子选项体系而是向引擎注册一个容器级插件IContainerPlugin为Container.export(type, options)提供video类型的导出能力。从源码结构看该插件由四个核心文件组成见 plugins/exports/video/srcExportVideoPlugin.ts实现IPlugin接口插件 ID 固定为export-videoneedsPlugin()始终返回true即只要注册就生效并通过动态import懒加载插件实例ExportVideoPluginInstance.ts实现IContainerPlugin真正执行画布捕获与MediaRecorder录制逻辑IExportVideoData.ts导出参数类型定义index.ts / index.lazy.ts / browser.ts包入口导出loadExportVideoPlugin加载函数。加载函数的核心工作非常直接在 index.ts 中调用engine.checkVersion(__VERSION__)做引擎版本兼容性校验然后通过engine.pluginManager.register(...)将插件注册进引擎。而 index.lazy.ts 提供了延迟加载变体——只有当注册时才会真正import插件类适合对首屏包体积敏感的场景。安装与快速接入清单根据 README.md接入只需三步安装或通过 CDN 引入tsparticles/engine在调用tsParticles.load(...)之前调用包加载函数loadExportVideoPlugin(...)按需通过引擎的导出 API 触发视频导出。包本身通过 npm / yarn 安装安装命令见下文。其package.json声明了唯一的 peer 依赖tsparticles/engineworkspace:*并提供.与./lazy两个导出入口分别对应常规与懒加载加载器版本为 4.3.3。CDN / Vanilla JS / jQuery 方式在原生 JavaScript或 jQuery场景下引入tsparticles.plugin.export.video.min.js这一个文件即可。该文件在全局挂载了加载函数loadExportVideoPlugin见 browser.ts 中的globalObject.loadExportVideoPlugin loadExportVideoPlugin赋值。脚本加载完成后即可初始化tsParticles并注册插件(async () { await loadExportVideoPlugin(); await tsParticles.load({ id: tsparticles, options: {/* options */}, }); })();ESM / CommonJS 方式该包同时兼容 ES Module 与 CommonJS。先安装依赖$ npm install tsparticles/plugin-export-video或$ yarn add tsparticles/plugin-export-videoCommonJS 用法const { tsParticles } require(tsparticles/engine); const { loadExportVideoPlugin } require(tsparticles/plugin-export-video); (async () { await loadExportVideoPlugin(); })();ESM 用法import { tsParticles } from tsparticles/engine; import { loadExportVideoPlugin } from tsparticles/plugin-export-video; (async () { await loadExportVideoPlugin(); })();注意在 Webpack / Vite 等打包工具中如果你的目标是减小主包体积也可以从tsparticles/plugin-export-video/lazy导入加载函数把插件类的解析推迟到运行时。触发视频导出参数与调用链导出参数IExportVideoData该插件没有独立的根选项键而是通过引擎导出 API 的data参数传递配置。参数由 IExportVideoData.ts 定义全部为可选参数类型说明默认值durationnumber导出视频时长秒5源码中defaultDuration 5fpsnumber录制帧率取container.actualOptions.fpsLimitmimeTypestring输出视频的 MIME 类型浏览器支持列表中的第一个类型调用方式tsParticles.load(...)会返回Container实例而引擎在 Container.ts 中提供了统一的export(type, options)方法它遍历容器内所有已注册插件找到支持指定type的插件并调用其export方法返回ExportResult定义见 ExportResult.ts含supported、blob、error字段最终把第一个支持的插件的blob返回给调用方若没有插件支持该类型则记录错误日志并返回undefined。因此实际触发录制的方式是import { tsParticles } from tsparticles/engine; import { loadExportVideoPlugin } from tsparticles/plugin-export-video; (async () { await loadExportVideoPlugin(); const container await tsParticles.load({ id: tsparticles, options: { fpsLimit: 60, particles: { number: { value: 80 }, move: { enable: true }, }, }, }); // 录制 5 秒视频默认时长帧率跟随 fpsLimit const blob await container.export(video, { duration: 5, fps: 60 }); if (blob) { const url URL.createObjectURL(blob); const a document.createElement(a); a.href url; a.download particles.webm; a.click(); URL.revokeObjectURL(url); } })();底层录制原理在 ExportVideoPluginInstance.ts 的#exportVideo私有方法中录制流程如下从container.canvas.domElement取得canvas元素调用element.captureStream(data.fps ?? container.actualOptions.fpsLimit)获得媒体流——帧率优先取用户传入的fps未传则回退到粒子配置的fpsLimit用new MediaRecorder(stream, { mimeType })创建录制器监听dataavailable事件收集数据块chunk监听stop事件时将所有 chunk 合并为一个Blobtype 为所选 MIME 类型并 resolverecorder.start()后通过setTimeout在data.duration ?? 5秒后调用recorder.stop()结束录制。值得注意的是整个录制完全发生在浏览器端不需要服务端转码导出的结果是内存中的Blob对象你可以自由决定如何展示如video预览或下载如上面的URL.createObjectURL 模拟点击。MIME 类型与编解码器支持浏览器能力探测由于不同浏览器对视频容器的支持差异很大插件在构造时ExportVideoPluginInstance.ts会通过MediaRecorder.isTypeSupported()探测当前环境的真实能力而不是硬编码输出格式。它探测的容器类型包括video/webmvideo/oggvideo/mp4video/x-matroskaMKV对每种容器又会组合以下编解码器逐一验证含大小写变体vp9, vp8, avc1, av1, h265, h265, h264, opus, pcm, aac, mpeg, mp4a最终得到当前浏览器确实支持的 MIME 类型列表并保存在实例的#supportedTypes中当用户未指定mimeType时插件默认取该列表的第一个元素源码中firstIndex 0。这意味着在不传mimeType的情况下实际输出格式取决于浏览器例如 Chrome 通常首选video/webm;codecsvp9而 Safari 可能偏向video/mp4。如果你想确保下载文件的扩展名正确建议在导出前自行判断blob.type或显式传入你确认可用的mimeType。另外源码中对MediaRecorder.isTypeSupported的探测覆盖了常见大小写形式vp9/VP9并注释指出codecs:冒号分隔的变体是误报来源因此被排除在外——这保证了能力探测的准确性。常见陷阱与排查建议README 明确列出了三条使用注意事项结合源码可以进一步解释其成因在loadExportVideoPlugin(...)之前调用tsParticles.load(...)这是最常见的错误。Container.export(video, ...)只会在已注册的插件中寻找video导出支持如果加载函数尚未执行engine.pluginManager.register未完成容器内就没有ExportVideoPluginInstance引擎会走完循环后记录Export plugin with type video not found错误并返回undefined。务必保证加载函数await完成后再加载配置。开启高级选项前确认 peer 依赖插件以tsparticles/engine为 peer 依赖见 package.json需要保证引擎版本与插件版本兼容loadExportVideoPlugin内部的engine.checkVersion(__VERSION__)会做版本校验版本不匹配时会抛出错误。一次只修改一组选项以快速定位回归由于fps、duration、mimeType相互影响录制结果例如强制指定了浏览器不支持的mimeType时MediaRecorder构造会直接抛异常排查问题时建议逐个调整参数避免多个变量叠加导致难以定位。总结tsparticles/plugin-export-video是一个薄而聚焦的浏览器端视频导出插件通过 index.ts 注册、由 ExportVideoPluginInstance.ts 完成captureStreamMediaRecorder录制并借助 Container.export 与 ExportResult 融入引擎统一的导出体系。使用时只需牢记先加载插件、再加载粒子配置、最后调用container.export(video, {...})的顺序并理解 MIME 类型由浏览器能力探测决定这一前提即可稳定地将任意 tsParticles 动画导出为可下载的视频文件。【免费下载链接】tsparticlestsParticles - Easily create highly customizable JavaScript particles effects, confetti explosions and fireworks animations and use them as animated backgrounds for your website. Ready to use components available for React.js, Vue.js (2.x and 3.x), Angular, Svelte, jQuery, Preact, Inferno, Solid, Riot and Web Components.项目地址: https://gitcode.com/GitHub_Trending/ts/tsparticles创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

MCP 的 get_order_detail 调不通?TaoToken 这样改 Agent 的 Base URL

MCP 的 get_order_detail 调不通?TaoToken 这样改 Agent 的 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 14:40:30 阅读更多 →
SpringBoot Actuator未授权访问:从信息泄露到深度利用实战

SpringBoot Actuator未授权访问:从信息泄露到深度利用实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/21 1:21:05 阅读更多 →
Python ORM实战:SQLAlchemy核心原理与最佳实践

Python ORM实战:SQLAlchemy核心原理与最佳实践

1. 为什么需要ORM工具?在Python生态中直接使用原生SQL语句操作数据库的时代早已过去。五年前我接手一个遗留系统时,发现代码库中充斥着这样的字符串拼接SQL:query "SELECT * FROM users WHERE name" user_input ""这种…

2026/9/20 20:39:22 阅读更多 →

最新新闻

2026最新哑语手势识别原理:3步搞定项目搭建与避坑指南

2026最新哑语手势识别原理:3步搞定项目搭建与避坑指南

2026最新哑语手势识别原理:3步搞定项目搭建与避坑指南 刚啃完几本《Python程序设计》,对着屏幕上的 import 和 def 觉得都懂了,但一心想做个“哑语手势识别”的小项目,手却彻底抖了。…

2026/9/22 4:22:51 阅读更多 →
逆水寒锦书难托速查手册:5个坑让你代码不报错

逆水寒锦书难托速查手册:5个坑让你代码不报错

逆水寒锦书难托速查手册:5个坑让你代码不报错 刚拿到“逆水寒锦书难托”这个需求的代码,是不是复制粘贴进去就报错?别慌,这坑我踩了三年才填平。很多人以为这是游戏策划的玄学配置,其实是数据结构与状态机逻辑的硬伤。今天这份速查手册,不讲虚的,直接…

2026/9/22 4:22:51 阅读更多 →
www.itunes.com底层逻辑拆解:面试被问原理答不上来?2026最新实战指南

www.itunes.com底层逻辑拆解:面试被问原理答不上来?2026最新实战指南

www.itunes.com底层逻辑拆解:面试被问原理答不上来?2026最新实战指南 面试被问到“www.itunes.com…

2026/9/22 4:22:51 阅读更多 →
3个坑点教你搞定c8500,保姆级教程含薪资查询与证书补办

3个坑点教你搞定c8500,保姆级教程含薪资查询与证书补办

3个坑点教你搞定c8500,保姆级教程含薪资查询与证书补办 刚把官网示例代码复制到本地,结果报错一堆,调试两小时没头绪?别慌,这正是很多开发者踩过的深坑。这篇保姆级教程不讲虚的,直接带你拆解c8500的核心逻辑,从环境配置到报错排查,再到底…

2026/9/22 4:22:50 阅读更多 →
3分钟搞懂污染指数源码解析,告别文档迷路

3分钟搞懂污染指数源码解析,告别文档迷路

3分钟搞懂污染指数源码解析,告别文档迷路 官方文档动辄几十页,翻到头都大了,核心逻辑却藏在角落。 想快速上手?别死磕文档,直接看【污染指数】的【源码解析】。 本文带你拆解 NPM 官方包中的核心算法,拒绝照本宣科。 入口定位:从 NPM…

2026/9/22 4:21:49 阅读更多 →
ssh软件保姆级教程

ssh软件保姆级教程

告别SSH配置卡死,这份避坑指南让你一次跑通 配置环境就卡半天,是不是让你怀疑人生?很多开发者在搭建远程开发环境或部署服务时,往往在SSH这一步就耗光了耐心。连接超时、权限拒绝、密钥不匹配,这些报错像拦路虎一样挡住去路。今天不聊虚的,直接上…

2026/9/22 4:21:48 阅读更多 →

日新闻

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天

3台商务办公笔记本实测:手写实现环境配置,告别卡半天 配置环境就卡半天?别怪机器慢,多半是你没选对工具链。在Java、Go或Python的项目现场, 手写实现…

2026/9/22 0:00:41 阅读更多 →
剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑

剑帝加点速查手册:3分钟搞懂核心逻辑 面试被问原理答不上来,是不是常态?别慌。很多开发者对着 GitHub 开源仓库里的代码发呆,看似简单实则暗藏玄机。今天这份【剑帝加点】速查手册,直接带你拆解核心实现,把面试必考的原理讲透。…

2026/9/22 0:00:41 阅读更多 →
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站…

2026/9/22 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/22 2:43:42 阅读更多 →