SVGA Preview
Compare one SVGA across six source-backed player profiles, frame by frame.
Upload a local .svga
Drop a file here or choose one. Processing stays in this browser.
Canvas settings
File information
- Dimensions
- —
- File size
- —
- Frames
- —
- FPS
- —
- Duration
- —
- Runtime memory
- —
- Bitmaps
- —
- Format
- —
Compatibility report
Load an SVGA to run compatibility checks.
SVGA player compatibility matrix
Each cell shows the locked player version, verification status, implementation note, and source location used for this comparison.
| Capability | SVGAPlayer-WebOfficial playerRepository | SVGAPlayer-Web-LiteOfficial playerRepository | AndroidSimulated (source-backed)Repository | iOSSimulated (source-backed)Repository | FlutterSimulated (source-backed)Repository |
|---|---|---|---|---|---|
| Version: svgaplayerweb@2.3.2 (a218cbe) | Version: svga@2.1.1 (5a4ad9d) | Version: master@662d0dc (2023-02-06) | Version: SVGAPlayer 2.5.7 + master@2e469f1 | Version: svgaplayer_flutter@2.2.0 (de7de70) | |
| Matte masks | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified partialMatte composition is available when the matte source is the first sprite and follows the key convention. Source: src/Canvas/renderer.js:117-153 - `matteSprites` / `destination-in` | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified unsupportedThe Lite schema omits matteKey, so matte masks are not rendered. Source: src/parser/svga-proto.ts:33-44 - `SpriteEntity` omits `matteKey` | Android / Version: master@662d0dc (2023-02-06) Verified partialMatte rendering requires Android API 21 or newer and a qualifying first sprite. Source: library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt:38-58 - requires first `.matte` Sprite and Android API 21+ | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedThe player installs matte content as a CALayer mask. Source: Source/SVGAPlayer.m:194-220 - matte content is installed as a CALayer mask | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedThe painter does not consume matteKey, so matte masks are not rendered. Source: lib/painter.dart:61-68 - `matteKey` read is commented out |
| .matte suffix requirement | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedThe renderer recognizes matte sources through the .matte marker in the image key. Source: src/Canvas/renderer.js:122-127 - `imageKey.indexOf(".matte")` | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified unsupportedNo matte path reads or applies the .matte suffix. Source: src/player/render.ts:40-45 - sprites draw linearly without matte handling | Android / Version: master@662d0dc (2023-02-06) Verified supportedThe matte source image key must end with .matte. Source: library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt:38-58 - `endsWith(".matte")` | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedThe matte source requires a .matte suffix. Source: Source/SVGAPlayer.m:208-214 - matte source requires `.matte` suffix | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedNo active matte path checks the .matte suffix. Source: lib/painter.dart:61-68 - painter never consumes `matteKey` |
| SVGA 1.x format | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedThe ZIP parsing path reads legacy movie.spec assets. Source: src/mockWorker.js:108-127 - `_decodeAssets` reads `movie.spec` from ZIP | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified unsupportedThe parser rejects files whose header is not SVGA version 2. Source: src/parser/index.ts:46-48 - rejects every header except SVGA version 2 | Android / Version: master@662d0dc (2023-02-06) Verified supportedThe ZIP parser includes a legacy movie.spec path. Source: library/src/main/java/com/opensource/svgaplayer/SVGAParser.kt:276-291,434-459 - ZIP `movie.spec` path | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedThe ZIP cache can load legacy movie.spec data. Source: Source/SVGAParser.m:128-164 - ZIP cache reads `movie.binary` or `movie.spec` | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedThe parser always inflates protobuf data and has no legacy ZIP path. Source: lib/parser.dart:31-42 - unconditional zlib inflate then protobuf decode |
| Embedded audio playback | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified partialEmbedded audio uses the Howler path, so browser audio policy can still block autoplay. Source: src/Canvas/renderer.js:59-82,244-267 - Howler-backed audio path | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified unsupportedAudio assets are skipped during parsing and never reach playback. Source: src/parser/index.ts:50-53 - keys starting with `audio` are skipped | Android / Version: master@662d0dc (2023-02-06) Verified supportedThe video entity prepares embedded audio for playback. Source: library/src/main/java/com/opensource/svgaplayer/SVGAVideoEntity.kt:192-207 - embedded audio setup | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedEmbedded data is passed to AVAudioPlayer. Source: Source/SVGAAudioLayer.m:22-32 - AVAudioPlayer reads embedded data | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedThe package prepares images only and exposes no embedded audio playback path. Source: lib/parser.dart:72-84; lib/player.dart - images only, no audio preparation or playback |
| Audio lookup from audios field | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedAudio entries resolve data by the declared audioKey. Source: src/Canvas/renderer.js:244-253 - `audios` entries look up `audio.audioKey` | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified unsupportedThe decoded movie model omits the audios collection. Source: src/parser/svga-proto.ts:290-310 - `MovieEntity` omits `audios` | Android / Version: master@662d0dc (2023-02-06) Verified supportedAudio data is resolved from each declared audioKey. Source: library/src/main/java/com/opensource/svgaplayer/SVGAVideoEntity.kt:229-240 - lookup by `audio.audioKey` | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedEach audio item uses audioKey to find its data. Source: Source/SVGAAudioLayer.m:27-30 - `audioItem.audioKey` indexes `audiosData` | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedThe player and painter do not read MovieEntity.audios. Source: lib/player.dart; lib/painter.dart - no reads of `MovieEntity.audios` |
| Vector KEEP shapes | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedKEEP frames reuse the last decoded vector shapes. Source: src/frameEntity.js:56-136 - KEEP resolves to `FrameEntity.lastShapes` | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified supportedKEEP shapes are resolved from the previous shape set during parsing. Source: src/parser/video-entity.ts:170-174 - KEEP reuses `lastShapes` during parsing | Android / Version: master@662d0dc (2023-02-06) Verified supportedThe parser replaces KEEP entries with the previous shape set. Source: library/src/main/java/com/opensource/svgaplayer/entities/SVGAVideoSpriteEntity.kt:39-56 - parser replaces KEEP shapes | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedThe vector layer keeps a frame cache for KEEP shapes. Source: Source/SVGAVectorLayer.m:37-85 - render-layer KEEP frame cache | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified supportedKEEP entries reuse the previous shape during parsing. Source: lib/parser.dart:55-69 - KEEP is replaced with `lastShape` during parsing |
| Vector stroke styles | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedCanvas rendering applies stroke width, cap, join, miter, and dash settings. Source: src/Canvas/renderer.js:270-293 - stroke, width, cap, join, miter and dash | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified supportedCanvas rendering applies the decoded vector stroke styles. Source: src/player/render.ts:134-155 - Canvas stroke styles are applied | Android / Version: master@662d0dc (2023-02-06) Verified supportedDecoded vector shapes retain their stroke settings. Source: library/src/main/java/com/opensource/svgaplayer/entities/SVGAVideoShapeEntity.kt:224-267 - stroke styles decoded | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedCAShapeLayer receives the decoded stroke styles. Source: Source/SVGAVectorLayer.m:307-356 - CAShapeLayer stroke styles applied | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified supportedThe painter applies width, cap, join, miter, and dash settings. Source: lib/painter.dart:174-231 - stroke width, cap, join, miter and dash |
| Bitmap sizing rule | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedEmbedded bitmaps draw at intrinsic dimensions instead of stretching to frame layout. Source: src/Canvas/renderer.js:173-199 - embedded bitmap uses intrinsic `drawImage(img, 0, 0)` | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified supportedBitmaps stretch to the frame layout width and height. Source: src/player/render.ts:72-81 - bitmap draws to frame layout width and height | Android / Version: master@662d0dc (2023-02-06) Verified supportedBitmaps are pre-scaled to match the frame layout. Source: library/src/main/java/com/opensource/svgaplayer/drawer/SVGACanvasDrawer.kt:221-229 - bitmap pre-scaled to layout | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedBitmap contents use frame bounds with aspect-fit resizing. Source: Source/SVGAContentLayer.m:40-79; Source/SVGABitmapLayer.m:22-28 - layout bounds with resize-aspect contents | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified supporteddrawImageRect targets the frame layout rectangle. Source: lib/painter.dart:97-131 - `drawImageRect` targets frame layout |
| Non-PNG bitmaps | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified partialPNG and JPEG signatures are accepted, but the forced PNG MIME path makes other formats uncertain. Source: src/Canvas/renderer.js:42-55,177-179 - PNG/JPEG signatures accepted but PNG MIME forced | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified partialImageBitmap can decode multiple formats, while the fallback path remains PNG-only. Source: src/parser/index.ts:54-58; src/player/index.ts:141-145 - generic ImageBitmap path, PNG-only fallback | Android / Version: master@662d0dc (2023-02-06) Verified supportedAndroid BitmapFactory decodes the embedded byte array without a PNG-only gate. Source: library/src/main/java/com/opensource/svgaplayer/bitmap/SVGABitmapByteArrayDecoder.kt:11-15 - generic `BitmapFactory.decodeByteArray` | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedUIImage decodes embedded data without a PNG-only gate. Source: Source/SVGAVideoEntity.m:173-181 - generic `UIImage initWithData` without PNG gate | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified supportedThe generic image decoder has no PNG-only gate. Source: lib/parser.dart:87-101 - generic `decodeImageFromList` without PNG gate |
| MovieParams resizeRatio | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified unsupportedThe bundled MovieParams schema does not include field 5. Source: src/proto.js:2 - `MovieParams` descriptor only contains fields 1 through 4 | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified unsupportedThe bundled MovieParams schema omits field 5. Source: src/parser/svga-proto.ts:13-31 - `MovieParams` omits field 5 | Android / Version: master@662d0dc (2023-02-06) Verified unsupportedThe generated MovieParams schema stops at field 4. Source: library/src/main/java/com/opensource/svgaplayer/proto/MovieParams.java:186-213 - generated schema has fields 1 through 4 only | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified unsupportedThe generated MovieParams schema stops at field 4. Source: Source/pbobjc/Svga.pbobjc.h:136-140 - `MovieParams` fields stop at 4 | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedThe generated MovieParams schema stops at field 4. Source: lib/proto/svga.pb.dart:28-38 - `MovieParams` generated fields stop at 4 |
| Playback fill mode | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedPlayback defaults to Forward fill mode. Source: src/Canvas/player.js:8-10,189 - default `fillMode = "Forward"` drives animator fillRule | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified supportedPlayer configuration defaults to forwards fill mode. Source: src/player/index.ts:37-47,84-87 - config defaults to `PLAYER_FILL_MODE.FORWARDS` | Android / Version: master@662d0dc (2023-02-06) Verified supportedSVGAImageView defaults to Forward fill mode. Source: library/src/main/java/com/opensource/svgaplayer/SVGAImageView.kt:29-47 - default `FillMode.Forward` | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 UnverifiedCompletion reads fillMode, but the inspected initialization path does not set a default. Source: Source/SVGAPlayer.m:60-63,377-383 - `fillMode` is read after completion but `initPlayer` does not initialize it | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified unsupportedSVGAImage exposes fit and clearing behavior, but no fillMode setting. Source: lib/player.dart:16-45 - `SVGAImage` exposes fit and clearsAfterStop but no fillMode |
| Clear after stop | SVGAPlayer-Web / Version: svgaplayerweb@2.3.2 (a218cbe) Verified supportedThe player clears its canvas after animation completion by default. Source: src/Canvas/player.js:8-10,206-210 - default true clears on animation end | SVGAPlayer-Web-Lite / Version: svga@2.1.1 (5a4ad9d) Verified supportedCalling stop always clears the rendering container. Source: src/player/index.ts:219-223 - `stop()` always calls `clearContainer()` | Android / Version: master@662d0dc (2023-02-06) Verified supportedSVGAImageView keeps the final frame because clearing after stop defaults to false. Source: library/src/main/java/com/opensource/svgaplayer/SVGAImageView.kt:40-47,66-70 - default false | iOS / Version: SVGAPlayer 2.5.7 + master@2e469f1 Verified supportedPlayer initialization enables clearing after stop. Source: Source/SVGAPlayer.m:60-63 - `initPlayer` sets `clearsAfterStop = YES` | Flutter / Version: svgaplayer_flutter@2.2.0 (de7de70) Verified supportedThe completed state clears by default. Source: lib/player.dart:37-45,173-176 - default true clears on completed status |
Compare an SVGA in four steps
- Upload an SVGA file or paste a direct URL that allows cross-origin access.
- Choose two player profiles for a focused comparison.
- Drag the shared timeline to inspect the same frame on both sides.
- Review the compatibility report, then open the editor to repair confirmed issues.
SVGA preview questions
Why does my SVGA look correct on iOS but lose its mask on Web?
Matte support differs by player. Web-Lite omits matteKey entirely, while other players impose source-order or naming rules. Check the exact player column before changing the file.
Why must a matte layer end with .matte?
Several official renderers identify matte source layers through that suffix. SVGA DIY itself can match matteKey directly, so a file may look correct here and still fail elsewhere.
Why can SVGAPlayer-Web-Lite not play my file?
Web-Lite accepts SVGA 2.x protobuf files and omits several features, including matte masks and embedded audio. A legacy 1.x ZIP or unsupported feature can therefore fail or render differently.
Why is a decorative layer positioned differently across players?
Players do not all size embedded bitmaps the same way. Some use intrinsic pixels, some stretch to layout, and iOS uses an aspect-fit path. A layout and bitmap size mismatch exposes that difference.
Why is embedded audio silent in the browser?
Web-Lite and SVGA DIY do not play embedded audio. The full Web player can, but browser autoplay policy may still require a user gesture before sound starts.
Found a cross-player mismatch?
Open the same file in SVGA DIY to inspect layers, replace assets, and export a corrected version locally.