跳转到内容

导出静帧和 GIF

静帧导出使用 Sequence 的完整画布尺寸。它适合封面、审核截图和缩略图原图;如果只是 UI 中显示一个小缩略图,直接请求低比例 Preview 帧更快。

import { SeekableMemorySink } from '@aelionsdk/export';
const sink = new SeekableMemorySink();
const options = {
profile: 'still-jpeg' as const,
timeUs: 2_500_000,
quality: 0.9,
sink: sink.writable,
cleanupSink: () => sink.cleanup(),
};
const report = await session.export.preflightProfile(options);
if (!report.ok) {
sink.cleanup();
showIssues(report.issues);
return;
}
const result = await session.export.startProfile(options);
const bytes = sink.finalize();
if ('timeUs' in result) {
console.log(result.mimeType, result.timeUs, result.bytesWritten);
}

timeUs 必须是非负安全整数,并落在 Sequence 可渲染范围内。支持的 profile:

Profile特点
still-png无损,文字和透明边缘更稳定,文件通常较大
still-jpeg有损、无透明,适合照片类封面
still-webpWeb 交付体积较小,目标系统需支持 WebP

quality 范围是 0–1,主要影响 JPEG/WebP。PNG 通常忽略它。不要把 quality 当作分辨率;输出像素仍由 Sequence width/height 决定。

const url = URL.createObjectURL(new Blob([bytes], { type: result.mimeType }));
const anchor = Object.assign(document.createElement('a'), {
href: url,
download: result.mimeType === 'image/png' ? 'frame.png' : 'frame.jpg',
});
anchor.click();
URL.revokeObjectURL(url);

如果要连续导出很多时间点,不要并发创建无限任务;一个 Session 同时只运行一个 active export job。可以按队列逐个执行,或把批量静帧交给远程服务。

import { OpfsSeekableSink } from '@aelionsdk/export';
const sink = new OpfsSeekableSink('preview.gif');
const options = {
profile: 'animated-gif' as const,
loopCount: 0,
sink: sink.writable,
cleanupSink: () => sink.cleanup(),
onProgress: (value: number) => updateProgress(value),
};
const report = await session.export.preflightProfile(options);
if (!report.ok) {
await sink.cleanup();
showIssues(report.issues);
return;
}
const result = await session.export.startProfile(options);
await sink.waitUntilFinalized();
const file = await sink.getFile();
console.log(result.mimeType, file.size);

loopCount: 0 表示无限循环。当前 GIF profile 按完整 Sequence 时长和帧率生成,没有单独的裁剪范围参数。要做 3 秒预览 GIF,可以先创建固定 3 秒的输出 Sequence,或交给服务端预览图任务。

GIF 色板有限,不适合长视频、照片渐变或高分辨率成片。它更适合很短的聊天预览和审核动图。高质量动画优先导出 MP4/WebM,再由交付服务生成多种预览规格。

静帧和 GIF 依赖浏览器 Canvas/OffscreenCanvas 能力。目标设备不支持时,preflight 会返回 issue;产品可以切换远程导出,而不是在运行到一半后才提示。