VoxelGltiExporter
VoxelGltiExporter 是 HarmonyOS HAR 的 VFP → GLTI 导出门面。它从输入 VFP 的权威数据重建 GLB,
并按配置可选保留原始 VFP 的 CHARACTECH_voxel_vfp 扩展、生成 H.264 转台视频,最后返回一个 MP4/GLTI
ArrayBuffer。
创建导出器不执行 I/O:
const exporter = VoxelKit.createGltiExporter();
导出器无状态,可顺序用于多个文件。不要并行启动多个大型导出;多个编码会竞争同一设备媒体编码器、内存 和 GPU,业务层应将导出操作排队。
export()
async export(
vfpBytes: ArrayBuffer,
options: VoxelGltiExportOptions = new VoxelGltiExportOptions()
): Promise<ArrayBuffer>
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
vfpBytes | ArrayBuffer | 是 | 完整 VFP 1.3 文件字节,必须仍包含可验证的权威数据。调用期间不要复用或修改其内容。 |
options | VoxelGltiExportOptions | 否 | 视频预览配置;省略时使用默认高质量转台视频。 |
成功时返回完整 MP4 字节。返回值不自动写入沙箱、媒体库或相册;宿主需使用自身已授权的文件/媒体 API
保存,并在业务层设置 video/mp4 MIME 类型和 .mp4 扩展名。
Native 解析、贪心面、GLB、离屏绘制、视频编码和封装在异步线程执行。Promise 未完成前不得假设输出可用; 若失败,不能保存任何中间字节。
const options = new VoxelGltiExportOptions();
options.durationMs = 5000;
const bytes = await VoxelKit.createGltiExporter().export(vfpBytes, options);
VoxelGltiExportOptions
所有字段只影响 H.264 转台预览;不会改变内嵌 VFP、GLB 的源数据,也不会改变输入 VFP。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
includeVideo | boolean | true | 是否写入 H.264 视频轨。为 false 时输出静态 GLTI,仍包含 GLB;是否附带 VFP 由 embedEditableVfp 决定。 |
embedEditableVfp | boolean | true | 是否在 GLB 中写入原始 VFP 和 CHARACTECH_voxel_vfp 扩展。为 false 时输出展示专用 GLTI,GltiPackageReader 必须拒绝恢复。此字段只控制编辑源保留策略。 |
width | number | 1024 | 视频宽度,单位像素。建议保持方形,以获得稳定的作品取景。 |
height | number | 1024 | 视频高度,单位像素。 |
frameRate | number | 24 | 视频帧率。帧数由此与 durationMs 共同决定。 |
durationMs | number | 3000 | 完整一圈转台时长,单位毫秒。 |
antiAliasScale | number | 2 | 内部抗锯齿倍率。2 使用更高的离屏采样再 resolve 到目标尺寸。 |
为了兼容不同设备的媒体编码能力,应用应将分辨率、帧率和时长视为资源预算,而不是无限制的渲染参数。
若设备拒绝当前视频配置或系统编码器不可用,Promise 会拒绝;可提示用户降低尺寸/帧率、缩短时长,或设置
includeVideo = false 输出静态交付容器。
输出与互操作
默认输出由以下内容组成:
- MP4 文件类型兼容
gltibrand; - 可播放的 H.264/MP4 视频轨;
meta/idat内的标准 GLB;- 当
embedEditableVfp = true时,GLB 中用于恢复的CHARACTECH_voxel_vfp原始 VFP 扩展。
普通播放器只需要处理视频轨;支持 GLB 的工具可以使用 GLB;VoxelKit 则通过
VoxelKit.createGltiReader().extractVfp() 恢复严格校验后的工程源。视频或 GLB 的显示结果不作为体素
编辑数据的校验依据。
不保留编辑源
const options = new VoxelGltiExportOptions();
options.embedEditableVfp = false;
const albumVideo = await VoxelKit.createGltiExporter().export(vfpBytes, options);
这个模式仍产生 video/mp4 字节,但删除私有 VFP 载荷。是否选择它取决于应用的数据保留和访问策略,而
不是视频保存位置。保存到相册、发送或上传的宿主流程见 导出到相册与分享。
失败与处理
Promise 可能因以下情况拒绝:VFP 不是 1.3 或缺失/损坏权威区段、source hash 不一致、Native .so 无法
加载、内存不足、设备不具备所需媒体编码能力、离屏 EGL/Surface 创建失败,或 MP4 封装后的 H.264 配置
无法通过完整性检查。
try {
const gltiBytes = await VoxelKit.createGltiExporter().export(vfpBytes);
// 保存或上传 gltiBytes
} catch (error) {
// 记录 error;向用户提供重试或降低视频规格的入口。
}
不能用错误后的普通 GLB、视频帧或部分 MP4 代替成功输出;它们不保证带有可恢复的 VFP。
完整用户流程见 导出到相册与分享。