SVGA 预览
用六种源码画像逐帧对比同一个 SVGA 的跨端表现。
上传本地 .svga
把文件拖到这里或从本机选择;所有处理都留在当前浏览器。
画布设置
文件信息
- 尺寸
- —
- 文件体积
- —
- 帧数
- —
- FPS
- —
- 时长
- —
- 运行时内存
- —
- 位图数量
- —
- 格式版本
- —
兼容体检报告
载入 SVGA 后开始兼容性检查。
SVGA 播放器兼容矩阵
每个单元格都列出锁定版本、核实状态、实现说明和本次对比采用的源码位置。
| 能力 | SVGAPlayer-Web官方播放器真播代码仓库 | SVGAPlayer-Web-Lite官方播放器真播代码仓库 | Android源码画像模拟代码仓库 | iOS源码画像模拟代码仓库 | Flutter源码画像模拟代码仓库 |
|---|---|---|---|---|---|
| 版本: svgaplayerweb@2.3.2 (a218cbe) | 版本: svga@2.1.1 (5a4ad9d) | 版本: master@662d0dc (2023-02-06) | 版本: SVGAPlayer 2.5.7 + master@2e469f1 | 版本: svgaplayer_flutter@2.2.0 (de7de70) | |
| Matte 遮罩 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实部分支持Matte 源位于首个精灵且符合命名约定时可以合成遮罩。 源码: src/Canvas/renderer.js:117-153 - `matteSprites` / `destination-in` | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实不支持Lite 的 schema 省略 matteKey,因此不会渲染 Matte 遮罩。 源码: src/parser/svga-proto.ts:33-44 - `SpriteEntity` omits `matteKey` | Android / 版本: master@662d0dc (2023-02-06) 已核实部分支持Matte 渲染要求 Android API 21 及以上,并要求首个精灵符合条件。 源码: library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt:38-58 - requires first `.matte` Sprite and Android API 21+ | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持播放器会把 Matte 内容安装为 CALayer mask。 源码: Source/SVGAPlayer.m:194-220 - matte content is installed as a CALayer mask | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持Painter 不读取 matteKey,因此不会渲染 Matte 遮罩。 源码: lib/painter.dart:61-68 - `matteKey` read is commented out |
| .matte 后缀要求 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持渲染器通过 imageKey 中的 .matte 标记识别遮罩源。 源码: src/Canvas/renderer.js:122-127 - `imageKey.indexOf(".matte")` | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实不支持现有渲染路径不会读取或应用 .matte 后缀。 源码: src/player/render.ts:40-45 - sprites draw linearly without matte handling | Android / 版本: master@662d0dc (2023-02-06) 已核实支持Matte 源的 imageKey 必须以 .matte 结尾。 源码: library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt:38-58 - `endsWith(".matte")` | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持Matte 源需要 .matte 后缀。 源码: Source/SVGAPlayer.m:208-214 - matte source requires `.matte` suffix | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持没有生效中的 Matte 路径检查 .matte 后缀。 源码: lib/painter.dart:61-68 - painter never consumes `matteKey` |
| SVGA 1.x 格式 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持ZIP 解析路径可读取旧版 movie.spec 素材。 源码: src/mockWorker.js:108-127 - `_decodeAssets` reads `movie.spec` from ZIP | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实不支持文件头不是 SVGA 2.x 时,解析器会直接拒绝。 源码: src/parser/index.ts:46-48 - rejects every header except SVGA version 2 | Android / 版本: master@662d0dc (2023-02-06) 已核实支持ZIP 解析器包含旧版 movie.spec 路径。 源码: library/src/main/java/com/opensource/svgaplayer/SVGAParser.kt:276-291,434-459 - ZIP `movie.spec` path | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持ZIP 缓存路径可以读取旧版 movie.spec。 源码: Source/SVGAParser.m:128-164 - ZIP cache reads `movie.binary` or `movie.spec` | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持解析器固定走 protobuf 解压,没有旧版 ZIP 路径。 源码: lib/parser.dart:31-42 - unconditional zlib inflate then protobuf decode |
| 内嵌音频播放 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实部分支持内嵌音频走 Howler 播放路径,但仍可能被浏览器自动播放策略拦截。 源码: src/Canvas/renderer.js:59-82,244-267 - Howler-backed audio path | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实不支持解析阶段会跳过音频素材,播放阶段也不会收到音频。 源码: src/parser/index.ts:50-53 - keys starting with `audio` are skipped | Android / 版本: master@662d0dc (2023-02-06) 已核实支持VideoEntity 会准备内嵌音频用于播放。 源码: library/src/main/java/com/opensource/svgaplayer/SVGAVideoEntity.kt:192-207 - embedded audio setup | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持内嵌数据会交给 AVAudioPlayer。 源码: Source/SVGAAudioLayer.m:22-32 - AVAudioPlayer reads embedded data | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持该包只准备图像,没有内嵌音频播放路径。 源码: lib/parser.dart:72-84; lib/player.dart - images only, no audio preparation or playback |
| 按 audios 字段查找音频 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持音频条目通过声明的 audioKey 查找数据。 源码: src/Canvas/renderer.js:244-253 - `audios` entries look up `audio.audioKey` | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实不支持解码后的 Movie 模型不包含 audios 集合。 源码: src/parser/svga-proto.ts:290-310 - `MovieEntity` omits `audios` | Android / 版本: master@662d0dc (2023-02-06) 已核实支持音频数据按每个条目声明的 audioKey 查找。 源码: library/src/main/java/com/opensource/svgaplayer/SVGAVideoEntity.kt:229-240 - lookup by `audio.audioKey` | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持每个音频条目通过 audioKey 查找数据。 源码: Source/SVGAAudioLayer.m:27-30 - `audioItem.audioKey` indexes `audiosData` | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持Player 与 Painter 都不读取 MovieEntity.audios。 源码: lib/player.dart; lib/painter.dart - no reads of `MovieEntity.audios` |
| 矢量 KEEP 图形 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持KEEP 帧复用上一次解码得到的矢量图形。 源码: src/frameEntity.js:56-136 - KEEP resolves to `FrameEntity.lastShapes` | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实支持解析时会从上一组图形解析 KEEP。 源码: src/parser/video-entity.ts:170-174 - KEEP reuses `lastShapes` during parsing | Android / 版本: master@662d0dc (2023-02-06) 已核实支持解析器会用上一组图形替换 KEEP 条目。 源码: library/src/main/java/com/opensource/svgaplayer/entities/SVGAVideoSpriteEntity.kt:39-56 - parser replaces KEEP shapes | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持矢量图层维护帧缓存以处理 KEEP 图形。 源码: Source/SVGAVectorLayer.m:37-85 - render-layer KEEP frame cache | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实支持解析时 KEEP 条目会复用上一组图形。 源码: lib/parser.dart:55-69 - KEEP is replaced with `lastShape` during parsing |
| 矢量描边样式 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持Canvas 渲染会应用线宽、端点、连接、斜接和虚线设置。 源码: src/Canvas/renderer.js:270-293 - stroke, width, cap, join, miter and dash | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实支持Canvas 渲染会应用解码后的矢量描边样式。 源码: src/player/render.ts:134-155 - Canvas stroke styles are applied | Android / 版本: master@662d0dc (2023-02-06) 已核实支持解码后的矢量图形会保留描边设置。 源码: library/src/main/java/com/opensource/svgaplayer/entities/SVGAVideoShapeEntity.kt:224-267 - stroke styles decoded | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持CAShapeLayer 会收到解码后的描边样式。 源码: Source/SVGAVectorLayer.m:307-356 - CAShapeLayer stroke styles applied | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实支持Painter 会应用线宽、端点、连接、斜接和虚线设置。 源码: lib/painter.dart:174-231 - stroke width, cap, join, miter and dash |
| 位图尺寸规则 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持内嵌位图按原始尺寸绘制,不拉伸到 frame layout。 源码: src/Canvas/renderer.js:173-199 - embedded bitmap uses intrinsic `drawImage(img, 0, 0)` | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实支持位图会拉伸到 frame layout 的宽高。 源码: src/player/render.ts:72-81 - bitmap draws to frame layout width and height | Android / 版本: master@662d0dc (2023-02-06) 已核实支持位图会预缩放到 frame layout 尺寸。 源码: library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt:221-229 - bitmap pre-scaled to layout | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持位图内容使用 frame bounds,并按 aspect-fit 方式调整。 源码: Source/SVGAContentLayer.m:40-79; Source/SVGABitmapLayer.m:22-28 - layout bounds with resize-aspect contents | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实支持drawImageRect 的目标区域是 frame layout。 源码: lib/painter.dart:97-131 - `drawImageRect` targets frame layout |
| 非 PNG 位图 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实部分支持代码接受 PNG 和 JPEG 签名,但强制 PNG MIME,因此其他格式仍有不确定性。 源码: src/Canvas/renderer.js:42-55,177-179 - PNG/JPEG signatures accepted but PNG MIME forced | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实部分支持ImageBitmap 可解码多种格式,但降级路径仍只按 PNG 处理。 源码: src/parser/index.ts:54-58; src/player/index.ts:141-145 - generic ImageBitmap path, PNG-only fallback | Android / 版本: master@662d0dc (2023-02-06) 已核实支持Android BitmapFactory 直接解码字节数组,不限制为 PNG。 源码: library/src/main/java/com/opensource/svgaplayer/bitmap/SVGABitmapByteArrayDecoder.kt:11-15 - generic `BitmapFactory.decodeByteArray` | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持UIImage 解码内嵌数据时没有 PNG 限制。 源码: Source/SVGAVideoEntity.m:173-181 - generic `UIImage initWithData` without PNG gate | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实支持通用图像解码器没有 PNG 限制。 源码: lib/parser.dart:87-101 - generic `decodeImageFromList` without PNG gate |
| MovieParams resizeRatio | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实不支持播放器内置的 MovieParams schema 不包含字段 5。 源码: src/proto.js:2 - `MovieParams` descriptor only contains fields 1 through 4 | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实不支持播放器内置的 MovieParams schema 省略字段 5。 源码: src/parser/svga-proto.ts:13-31 - `MovieParams` omits field 5 | Android / 版本: master@662d0dc (2023-02-06) 已核实不支持生成的 MovieParams schema 只到字段 4。 源码: library/src/main/java/com/opensource/svgaplayer/proto/MovieParams.java:186-213 - generated schema has fields 1 through 4 only | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实不支持生成的 MovieParams schema 只到字段 4。 源码: Source/pbobjc/Svga.pbobjc.h:136-140 - `MovieParams` fields stop at 4 | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持生成的 MovieParams schema 只到字段 4。 源码: lib/proto/svga.pb.dart:28-38 - `MovieParams` generated fields stop at 4 |
| 播放 fillMode | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持播放默认采用 Forward fillMode。 源码: src/Canvas/player.js:8-10,189 - default `fillMode = "Forward"` drives animator fillRule | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实支持播放器配置默认采用 forwards fillMode。 源码: src/player/index.ts:37-47,84-87 - config defaults to `PLAYER_FILL_MODE.FORWARDS` | Android / 版本: master@662d0dc (2023-02-06) 已核实支持SVGAImageView 默认采用 Forward fillMode。 源码: library/src/main/java/com/opensource/svgaplayer/SVGAImageView.kt:29-47 - default `FillMode.Forward` | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 存疑完成回调会读取 fillMode,但已检查的初始化路径没有设置默认值。 源码: Source/SVGAPlayer.m:60-63,377-383 - `fillMode` is read after completion but `initPlayer` does not initialize it | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实不支持SVGAImage 暴露 fit 与清空行为,但没有 fillMode 设置。 源码: lib/player.dart:16-45 - `SVGAImage` exposes fit and clearsAfterStop but no fillMode |
| 停止后清空 | SVGAPlayer-Web / 版本: svgaplayerweb@2.3.2 (a218cbe) 已核实支持动画完成后默认清空画布。 源码: src/Canvas/player.js:8-10,206-210 - default true clears on animation end | SVGAPlayer-Web-Lite / 版本: svga@2.1.1 (5a4ad9d) 已核实支持调用 stop 会始终清空渲染容器。 源码: src/player/index.ts:219-223 - `stop()` always calls `clearContainer()` | Android / 版本: master@662d0dc (2023-02-06) 已核实支持clearsAfterStop 默认是 false,因此 SVGAImageView 会保留末帧。 源码: library/src/main/java/com/opensource/svgaplayer/SVGAImageView.kt:40-47,66-70 - default false | iOS / 版本: SVGAPlayer 2.5.7 + master@2e469f1 已核实支持播放器初始化时会启用停止后清空。 源码: Source/SVGAPlayer.m:60-63 - `initPlayer` sets `clearsAfterStop = YES` | Flutter / 版本: svgaplayer_flutter@2.2.0 (de7de70) 已核实支持播放完成时默认清空。 源码: lib/player.dart:37-45,173-176 - default true clears on completed status |
四步完成 SVGA 对比
- 上传 SVGA 文件,或粘贴允许跨域访问的文件直链。
- 选择两个播放器端,建立聚焦的对照组合。
- 拖动共享时间轴,在两侧查看同一帧的表现。
- 阅读兼容体检报告,再到修改器修复已确认的问题。
SVGA 预览常见问题
为什么我的 SVGA 在 iOS 上正常,Web 上遮罩失效?
不同播放器的 Matte 支持并不一致。Web-Lite 完全省略 matteKey,其他播放器还可能要求特定图层顺序或命名。修改文件前请先确认具体播放器列。
为什么遮罩图层必须以 .matte 结尾?
多个官方渲染器通过这个后缀识别 Matte 源。SVGA DIY 可以直接匹配 matteKey,所以同一文件可能在这里正常,在其他端失效。
为什么 SVGAPlayer-Web-Lite 播不了我的文件?
Web-Lite 只接受 SVGA 2.x protobuf 文件,并且省略 Matte 与内嵌音频等能力。旧版 1.x ZIP 或不支持的特性可能导致失败或表现不同。
为什么装饰层在不同播放器里位置不一样?
各端采用的位图尺寸规则不同。有的使用原始像素,有的拉伸到 layout,iOS 使用 aspect-fit。layout 与位图尺寸不一致时,偏移就会暴露。
为什么内嵌音频在网页上不出声?
Web-Lite 与 SVGA DIY 不播放内嵌音频。Web 全量版可以播放,但浏览器自动播放策略仍可能要求用户先点击页面。
发现跨端差异?
把同一文件放进 SVGA DIY,检查图层、替换素材,并在本地导出修正后的版本。