@bendyline/squisq-video

中文文档
2.4.20发布于 2026/11/08MITTypeScriptES Module构建来源已验证近 30 天下载 6537

跨运行时段视频和动画-GIF帮助器有基于浏览器的ffmpeg. 用于 Squisq 文档的编码

中文使用文档
文档目录11 节
  1. 安装
  2. 里面的东西
  3. 快速启动
  4. 生成渲染器 HTML
  5. 编码框架到 MP4
  6. ffmpeg.wasm 运行时间资产
  7. 计划一个 Doc 的音频
  8. 质量预设
  9. 方向尺寸
  10. 相关软件包
  11. 许可证

@bendyline/squisq-视频

视频和动画-GIF渲染斯奎斯克文件的基础. 其纯正的时间线、质量、调色板和渲染-HTML助手在Node.js和浏览器中工作; framesToMp4Wasm 在浏览器运行时没有本地依赖性.

部分 斯奎斯克语Name 单相机.

npm MIT License

安装

npm install @bendyline/squisq-video

里面的东西

导出说明
generateRenderHtml(doc, options)自成一体的 HTML 页面,带有无头框抓取的嵌入媒体
framesToMp4Wasm(frames, audio, options)通过ffmpeg.wasm将 PNG 帧(+可选音频)编码为 MP4
computeAudioTimeline(doc, coverPreRoll?)将一个 doc 的描述 + 定时介质平整为绝对定时的音频剪辑( 浏览器导出和 CLI 混合共享)
bitrateForQuality(quality, width, height)目标 H.264 比特率(w*h*bitsPerPixel)——WebCodecs比特率的单一真理源
ffmpegVideoQualityArgs, (中文(简体) ), audioBitrateArg, (中文(简体) ), ffmpegAudioMuxArgs共享 FFmpeg 旗; 音频粘贴垫会简短地描述, 因此无法截取视频
ffmpegGifFilterGraph, (中文(简体) ), ffmpegGifOutputArgs, (中文(简体) ), ffmpegGifPalette* 帮助者共享全局盘 GIF 过滤器,包括双通调色板生成/应用
QUALITY_PRESETS, (中文(简体) ), ORIENTATION_DIMENSIONS, (中文(简体) ), resolveDimensions质量/分配预设和帮助
validateVideoExportOptions(options)FPS 故障运行时间验证、尺寸、质量和方向
VideoExportOptions, (中文(简体) ), VideoQuality, (中文(简体) ), VideoOrientation, (中文(简体) ), GifDither, (中文(简体) ), QualityPreset, (中文(简体) ), EncoderResult共享视频和GIF类型
fetchFile再出口 @ffmpeg/util是因为 fetchFile 用于准备音频字节

这个软件包是共享的基础 @bendyline/squisq-视频反应 (浏览器导出UI)和 @bendyline/squisq-cli (英语) (单位:千美元)squisq video,将渲染的 HTML 与 Playwright 捕获和 ffmpeg 编码相配.

快速启动

生成渲染器 HTML

创建一个自成一体的 HTML 页面,在渲染模式中挂载独立的 Squisq 播放器,所有图像和音频嵌入为 Base64 数据 URI 。 无头浏览器( Playwright, Puppeteer) 获得玩家专用控件 SquisqPlayer.getHandle(root) 并使用它的渲染 API 步入帧并截取每个帧:

刻意进行实例扫描;生成的页面不曝光 高级 window.seekTo 或者说 window.getDuration 函数.

import { generateRenderHtml } from '@bendyline/squisq-video';
import { PLAYER_BUNDLE } from '@bendyline/squisq-react/standalone-source';

const html = generateRenderHtml(doc, {
  playerScript: PLAYER_BUNDLE, // the IIFE player bundle source string
  images, // Map<string, ArrayBuffer> — embedded as data URIs
  audio, // Map<string, ArrayBuffer> — embedded as data URIs
  width: 1920, // default 1920
  height: 1080, // default 1080
  captionStyle: 'standard', // 'standard' | 'social' — omit for no captions
});

编码框架到 MP4

import { framesToMp4Wasm } from '@bendyline/squisq-video';

const { data, duration } = await framesToMp4Wasm(
  frames, // Uint8Array[] — PNG frame bytes, in order
  audioBytes, // Uint8Array | null — optional WAV/MP3/AAC track (muxed as AAC)
  {
    fps: 30, // default 30
    quality: 'normal', // 'draft' | 'normal' | 'high' (default 'normal')
    orientation: 'landscape', // 'landscape' | 'portrait' (default 'landscape')
    // width / height override the orientation defaults (both must be EVEN)
    // REQUIRED — see "ffmpeg.wasm runtime assets" below:
    ffmpegWasm: {
      coreURL: '/vendor/ffmpeg-core.js',
      wasmURL: '/vendor/ffmpeg-core.wasm',
    },
    onProgress: (percent, phase) => console.log(`${phase}: ${percent}%`),
  },
);
// data: Uint8Array of MP4 bytes; duration: seconds (frames.length / fps)

编码为H.264(libx264, (中文(简体) ), yuv420p),带有可选的AAC音频;帧被缩放/加到目标维度上保存宽度比. ffmpeg.wasm 需要时 SharedArrayBuffer,这通常意味着为COOP/COEP头. framesToMp4Wasm 只使用浏览器;节点呼叫器可以使用 framesToMp4Native 或者说 framesToMp4NativeBytes 从 @bendyline/squisq-cli/api。 。 。 .

尺寸必须均匀. validateVideoExportOptions (称为 resolveDimensions故你应当依真理而加以否认 width编号 :height 而不是圆形: H.264's yuv420p 铬亚采样不能代表奇异的维度,默默地运送一个大小的调用者从未要求断裂-ratio-敏感管道. 该规则被统一应用于MP4和GIF,因此它不依赖于输出格式或运行时间.

ffmpeg.wasm 运行时间资产

ffmpegWasm.coreURL 每个ffmpeg都需要。 代码路径 (单位:千美元)framesToMp4Wasm中,加GIF转码和音频粘接 @bendyline/squisq-video-react) (中文(简体) ). 显示它会产生一个可操作错误 .

这是故意的. @ffmpeg/ffmpeg属于自己的 load() 回到硬码 https://unpkg.com/@ffmpeg/core@<version>/… URL,可以使这个库在运行时获取和执行无标注的第三方代码——离线/CSP限制主机的不透明故障和每个消费者的供应链表面. 斯奎斯克从来不会触发这种倒计时.

主机接线: 安装 @ffmpeg/core,以同源路径公布其资产,并点 ffmpegWasm 在他们.

import type { FfmpegWasmLoadConfig } from '@bendyline/squisq-video';

// Copy node_modules/@ffmpeg/core/dist/esm/ffmpeg-core.{js,wasm}
// into your app's static assets, then:
export const FFMPEG_WASM: FfmpegWasmLoadConfig = {
  coreURL: '/ffmpeg-core/ffmpeg-core.js',
  wasmURL: '/ffmpeg-core/ffmpeg-core.wasm',
};

packages/site/vite.config.ts (单位:千美元) ffmpegCorePlugin+) 加上 (中文(简体) ) packages/site/src/ffmpegWasmConfig.ts 是Vite的完整实例,包括必须随核心文件一起旅行的GPL通知。 故意接受远程核心,将 URL 作为 coreURL 明确——要求选择权属于您,而不是默默默认.

计划一个 Doc 的音频

computeAudioTimeline(doc, coverPreRoll?) 将医生的描述片段和定时媒体剪辑转换成一个平坦的绝对时间列表 AudioTimelineClips. 它是纯的和可节点测试的,是浏览器MP4导出和CLI混合路径用于放置音频(因此两者从未漂移)的单一真理源. 叙述部分按顺序排列;定时媒体片段按其绝对位置排列;每个起始点由 coverPreRoll (default 0) 与无声封面预卷保持同步.

import { computeAudioTimeline } from '@bendyline/squisq-video';

const clips = computeAudioTimeline(doc, 2); // [{ src, startSec, sourceInSec, durationSec }, …]

质量预设

每个 QualityPreset 还携带 bitsPerPixel (用于WebCodecs比特率) 目标通过 bitrateForQuality和 audioBitrate (目标AAC比特/秒):

预设FFmpeg 预设通用报告格式位/ 像素AAC 比特率使用大小写
draft超级快第28条2个96克/小时快速预览
normal介质第23条页:1128克/小时一般用途出口
high缓慢第 18 条第8条192千位点最后产出

方向尺寸

方向宽度高度
landscape1920年 (中文(简体) )1080号
portrait1080号1920年 (中文(简体) )

resolveDimensions(options) 应用这些默认值, 明确遵守 width编号 :height 超载.

见全 API 参考 所有类型.

软件包说明
@bendyline/squisq (英语)无头核心——计划,模板,下标
@bendyline/squisq-反应反应组件 + 独立播放器捆绑
@bendyline/squisq-视频反应对浏览器视频导出进行回放 UI
@bendyline/squisq-cli (英语)用于文档转换和视频渲染的 CLI

许可证

麻省理工学院

版本与发布记录

@bendyline/squisq-video 共发布 75 个版本,首次发布于 2026/03/26;过去 12 个月发布了 75 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
2.4.20latest2026/11/08今天
2.4.192026/11/07今天
2.4.182026/11/052 天前
2.4.172026/11/053 天前
2.4.162026/11/017 天前
2.4.152026/10/308 天前

关于 @bendyline/squisq-video 的常见问题

@bendyline/squisq-video 是什么?

跨运行时段视频和动画-GIF帮助器有基于浏览器的ffmpeg. 用于 Squisq 文档的编码

如何安装 @bendyline/squisq-video?

在项目目录运行 npm install @bendyline/squisq-video,或使用 pnpm add / yarn add / bun add。

@bendyline/squisq-video 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@bendyline/squisq-video 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@bendyline/squisq-video 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^22.22.2 || ^24.15.0 || >=26.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@bendyline/squisq-video 可以商用吗?

@bendyline/squisq-video 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@bendyline/squisq-video 的下载量有多少?

根据 npm 官方下载统计,@bendyline/squisq-video 在 2026/10/08 – 2026/11/06 这 30 天内被下载 6,537 次,日均约 218 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@bendyline/squisq-video 还在维护吗?

最新版本 2.4.20 发布于 2026/11/08(今天);至今共发布 75 个版本,其中过去 12 个月发布了 75 个;首次发布于 2026/03/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。