GltiPackageReader
GltiPackageReader 读取 VoxelKit 的可编辑 GLTI。它只接受内嵌原始 VFP 的文件,不做 GLB 网格或视频的反体素化。
from voxelkit import GltiPackageReader
reader = GltiPackageReader()
extract_vfp()
reader.extract_vfp(
source: bytes | bytearray | memoryview | str | pathlib.Path,
) -> bytes
在内存中提取并验证原始 VFP。
| 参数 | 类型 | 说明 |
|---|---|---|
source | bytes | bytearray | memoryview | str | Path | 完整 GLTI 字节,或 GLTI 文件路径。str 会按文件路径处理,不接受 URL。 |
返回值是 GLB 扩展中原样保存的 VFP 字节。方法不写文件,适合随后交给上传、对象存储或其他内存 API。
extract_to_vfp()
reader.extract_to_vfp(
source: bytes | bytearray | memoryview | str | pathlib.Path,
output_path: str | pathlib.Path,
) -> GltiExtractionResult
提取、验证并写出 VFP。output_path 的父目录不存在时会自动创建;同名目标会被覆盖。验证在写入前完成,因此失败时不会得到部分恢复的文件。
result = reader.extract_to_vfp("incoming.glti.mp4", "assets/recovered.vfp")
print(result.output)
print(result.vfp_bytes, result.vfp_sha256, result.source_hash)
返回对象字段见 GLTI 选项与结果对象。
验证序列
每次提取都会完成以下检查:
- ISO-BMFF 首项为
ftyp,compatible brands 含glti; - 顶层
meta内存在idatGLB 项; - GLB 是长度一致的 v2 JSON + BIN 双区段结构;
CHARACTECH_voxel_vfp使用vfp-raw,其 bufferView、长度和范围正确;- 内嵌 VFP 的 SHA-256 与 GLB 扩展一致;
- VFP 的
PAL0、VOX0与sourceHash能重新通过权威校验。
该顺序同时阻止“容器看似可读、实际编辑源已被替换”的情况。
异常与边界
ValueError 表示 GLTI/GLB 布局、扩展声明、长度、哈希或权威 VFP 不可信;OSError 表示文件读取或写入失败。
展示专用 GLTI 会抛出 ValueError,错误文本包含 presentation-only。这是预期行为:该模式明确没有内嵌 VFP,SDK 不会尝试从 H.264 或标准 GLB 制造近似 VFP。
对于大型资产,读取器需要在内存中持有 GLTI、内嵌 VFP 和解码后的权威体素数据。服务端应限制上传尺寸、在工作线程执行恢复,并在成功后尽快释放输入字节。