@bendyline/squisq-视频
视频和动画-GIF渲染斯奎斯克文件的基础. 其纯正的时间线、质量、调色板和渲染-HTML助手在Node.js和浏览器中工作; framesToMp4Wasm 在浏览器运行时没有本地依赖性.
部分 斯奎斯克语Name 单相机.
安装
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条 | 页:1 | 128克/小时 | 一般用途出口 |
high | 缓慢 | 第 18 条 | 第8条 | 192千位点 | 最后产出 |
方向尺寸
| 方向 | 宽度 | 高度 |
|---|---|---|
landscape | 1920年 (中文(简体) ) | 1080号 |
portrait | 1080号 | 1920年 (中文(简体) ) |
resolveDimensions(options) 应用这些默认值, 明确遵守 width编号 :height 超载.
见全 API 参考 所有类型.
相关软件包
| 软件包 | 说明 |
|---|---|
| @bendyline/squisq (英语) | 无头核心——计划,模板,下标 |
| @bendyline/squisq-反应 | 反应组件 + 独立播放器捆绑 |
| @bendyline/squisq-视频反应 | 对浏览器视频导出进行回放 UI |
| @bendyline/squisq-cli (英语) | 用于文档转换和视频渲染的 CLI |