Backends
Each target has one backend. allBackends() registers the right one from the filmstrip bundle, or call its own
function if you depend on the backend directly.
| Backend | Targets | Artifact | Register with |
|---|---|---|---|
| Media3 | Android | filmstrip-transform-media3 |
media3Backend() |
| AVFoundation | iOS and macOS | filmstrip-transform-avfoundation |
avFoundationBackend() |
| WebCodecs | js and wasmJs |
filmstrip-transform-webcodecs |
webCodecsBackend() |
| ffmpeg | jvm |
filmstrip-transform-ffmpeg |
ffmpegBackend() |
What each one needs
Section titled “What each one needs”Media3
Section titled “Media3”Android API 24 or later. The application context comes from App Startup. Which codecs and sizes are available is read from the device’s encoders.
AVFoundation
Section titled “AVFoundation”iOS 16 or macOS 12 or later. Nothing else to install. Which video codecs are available is read from VideoToolbox.
WebCodecs
Section titled “WebCodecs”A browser with WebCodecs and WebGL2. A page with no VideoEncoder offers no video codecs at all. Keeping an HDR grade
also needs a float framebuffer and a VP9 Profile 2 encoder.
ffmpeg
Section titled “ffmpeg”ffmpeg and ffprobe 8.0 or later on the machine. filmstrip ships neither, and finds them as
Requirements describes. What else it can do depends on the build:
| To do this | The build needs |
|---|---|
| Encode H.264 | libx264 or h264_videotoolbox |
| Encode HEVC | libx265 or hevc_videotoolbox |
| Encode VP9 | libvpx-vp9 |
| Encode AAC or ALAC | The aac or alac encoder |
| Tone map | The lut1d, geq and colorchannelmixer filters |
Draw Fill.Blur |
The gblur filter, and colorchannelmixer to dim it |
| Draw an AVIF or HEIC picture | A decoder for it |
| Draw a JPEG XL picture | libjxl |
Preview features
Section titled “Preview features”features on a player says what this backend can do on this device.
| Feature | Android | Apple | Browser | JVM |
|---|---|---|---|---|
FrameReadback |
Yes | Yes | Needs WebGL2 | Yes |
FrameStepping |
Yes | Yes | Needs WebGL2 | Yes |
LiveParameterRedraw |
Yes | Yes | Needs WebGL2 | No |
AudioMonitoring |
When media3 can | No | Needs Web Audio and AudioDecoder |
No |
HdrPreview |
When the display can | No | No | No |
PlaybackSpeed |
No | No | No | No |
See Player for what each one means.
Preview parity
Section titled “Preview parity”previewInfo reports how closely a preview matches its export, and parityNotes holds the detail per effect. Every
built-in effect a backend runs is EffectParity.Exact, apart from these.
| Effect | Android | Apple | Browser | JVM |
|---|---|---|---|---|
TextOverlay |
Approximate |
Approximate |
Exact |
Approximate |
Scale |
Exact |
Exact |
Exact |
Approximate |
TextOverlay differs in glyph antialiasing. Its line breaks, metrics and measured size stay exact. Scale differs on
ffmpeg because swscale resamples with a bicubic kernel, so detail on a downscale isn’t the same as the preview.