# ๐ŸŽฌ FFmpegKit for Flutter โ€” Minimal-GPL **Run `FFmpeg` & `FFprobe` on Android, iOS, macOS, Windows and Linux from a single Dart API.** _A maintained fork of the original [FFmpegKit](https://github.com/arthenica/ffmpeg-kit/tree/main/flutter/flutter), updated for the Android V2 embedding and Flutter 3+._

pub version FFmpeg 8.1.2 Discord Buy Me A Coffee

--- ## โœจ Features - ๐Ÿงฐ **Full toolkit** โ€” both `FFmpeg` and `FFprobe`, with per-session logs, statistics and callbacks. - ๐Ÿ“ฑ **Five platforms** โ€” `Android`, `iOS`, `macOS`, `Windows` (x86_64), and `Linux` (x86_64) behind one API. - ๐ŸŽž๏ธ **FFmpeg `v8.1.2`** โ€” full command-line-compatible build. - ๐Ÿ—‚๏ธ **Android SAF** โ€” process Storage Access Framework URIs directly. - ๐Ÿ“š **External libraries** โ€” see the [enabled-libraries table](#-enabled-libraries) below. - ๐Ÿ”„ **Modernised bindings** for the latest Flutter and Android/macOS toolchains. - ๐Ÿ“ฆ **Swift Package Manager** โ€” iOS & macOS integrate via SPM (Flutter 3.24+) or CocoaPods, with prebuilt checksum-pinned XCFrameworks. ## ๐Ÿ“ฆ Install ```yaml dependencies: ffmpeg_kit_flutter_new_min_gpl: ^2.6.0 ``` ```dart import 'package:ffmpeg_kit_flutter_new_min_gpl/ffmpeg_kit.dart'; ``` ## ๐ŸŽฏ Choose your package There are **eight** `ffmpeg-kit` packages โ€” pick the smallest one that covers the codecs and features you need. `GPL`-licensed codecs (`x264`, `x265`, `xvidcore`, `vid.stab`) are only in the `-gpl` packages. | Package | Best for | |---|---| | [`_min`](https://pub.dev/packages/ffmpeg_kit_flutter_new_min) | Smallest build โ€” core FFmpeg only | | [`_min_gpl`](https://pub.dev/packages/ffmpeg_kit_flutter_new_min_gpl) **(this one)** | Minimal **+ GPL** codecs (x264/x265/xvid/vid.stab) | | [`_https`](https://pub.dev/packages/ffmpeg_kit_flutter_new_https) | Adds TLS (`gnutls`) for `https://` inputs | | [`_https_gpl`](https://pub.dev/packages/ffmpeg_kit_flutter_new_https_gpl) | HTTPS **+ GPL** codecs | | [`_audio`](https://pub.dev/packages/ffmpeg_kit_flutter_new_audio) | Audio-focused (mp3, opus, vorbis, speex, โ€ฆ) | | [`_video`](https://pub.dev/packages/ffmpeg_kit_flutter_new_video) | Video-focused (dav1d, vpx, theora, webp, โ€ฆ) | | [`_full`](https://pub.dev/packages/ffmpeg_kit_flutter_new_full) | Everything except GPL codecs | | [`ffmpeg_kit_flutter_new`](https://pub.dev/packages/ffmpeg_kit_flutter_new) | **Full + GPL** โ€” every library | ## ๐Ÿš€ Quick start ```dart import 'package:ffmpeg_kit_flutter_new_min_gpl/ffmpeg_kit.dart'; final session = await FFmpegKit.execute('-i input.mp4 -c:v mpeg4 output.mp4'); final returnCode = await session.getReturnCode(); if (ReturnCode.isSuccess(returnCode)) { // โœ… done } else if (ReturnCode.isCancel(returnCode)) { // โน๏ธ cancelled } else { // โŒ error โ€” inspect await session.getLogs() } ``` ## ๐Ÿงฉ Enabled libraries Below is which system and external libraries each package enables. Some parts of `FFmpeg` are `GPL`-licensed and are only present in the `GPL` packages.
min min-gpl https https-gpl audio video full full-gpl
external libraries - vid.stab
x264
x265
xvidcore
gmp
gnutls
gmp
gnutls
vid.stab
x264
x265
xvidcore
lame
libilbc
libvorbis
opencore-amr
opus
shine
soxr
speex
twolame
vo-amrwbenc
dav1d
fontconfig
freetype
fribidi
kvazaar
libass
libiconv
libtheora
libvpx
libwebp
snappy
zimg
dav1d
fontconfig
freetype
fribidi
gmp
gnutls
kvazaar
lame
libass
libiconv
libilbc
libtheora
libvorbis
libvpx
libwebp
libxml2
opencore-amr
opus
shine
snappy
soxr
speex
twolame
vo-amrwbenc
zimg
dav1d
fontconfig
freetype
fribidi
gmp
gnutls
kvazaar
lame
libass
libiconv
libilbc
libtheora
libvorbis
libvpx
libwebp
libxml2
opencore-amr
opus
shine
snappy
soxr
speex
twolame
vid.stab
vo-amrwbenc
x264
x265
xvidcore
zimg
android system libraries zlib
MediaCodec
ios system libraries bzip2
AudioToolbox
AVFoundation
iconv
zlib
ios VideoToolbox VideoToolbox VideoToolbox - - - - VideoToolbox VideoToolbox
macos system libraries bzip2
AudioToolbox
AVFoundation
Core Image
iconv
OpenCL
OpenGL
VideoToolbox
zlib
## ๐Ÿ“ฑ Platform support
Android
API Level
Kotlin
Min Version
iOS
Min Target
macOS
Min Target
Windows Linux
24 1.8.22 14.0 10.15 10+ (x86_64) x86_64
**Architectures** โ€” Android: `arm-v7a`, `arm-v7a-neon`, `arm64-v8a`, `x86`, `x86_64` ยท iOS: `arm64` (device) + `arm64`/`x86_64` (simulator, incl. Apple Silicon / Xcode 26), shipped as `.xcframework` ยท macOS: `arm64`, `x86_64`. > **Windows:** prebuilt FFmpeg **8.1.2** libraries (x86_64) are downloaded automatically at build time. For local development against a self-built bundle, set `FFMPEGKIT_LOCAL_DIR` (env or CMake cache variable) to the bundle directory before `flutter run/build windows`. > **Linux:** prebuilt FFmpeg **8.1.2** libraries (x86_64) are downloaded automatically at build time, exactly as on Windows; `FFMPEGKIT_LOCAL_DIR` works the same way. In addition to Flutter's standard Linux prerequisites (`clang`, `cmake`, `ninja-build`, `pkg-config`, `libgtk-3-dev`), the plugin needs **`libjson-glib-dev`**: > > ```bash > sudo apt-get install libjson-glib-dev # Debian/Ubuntu > sudo dnf install json-glib-devel # Fedora > ``` ## ๐Ÿ“– Usage
Execute a command & read the result ```dart import 'package:ffmpeg_kit_flutter_new_min_gpl/ffmpeg_kit.dart'; FFmpegKit.execute('-i file1.mp4 -c:v mpeg4 file2.mp4').then((session) async { final returnCode = await session.getReturnCode(); if (ReturnCode.isSuccess(returnCode)) { // SUCCESS } else if (ReturnCode.isCancel(returnCode)) { // CANCEL } else { // ERROR } }); ```
Inspect a session ```dart FFmpegKit.execute('-i file1.mp4 -c:v mpeg4 file2.mp4').then((session) async { final sessionId = session.getSessionId(); final command = session.getCommand(); final state = await session.getState(); final returnCode = await session.getReturnCode(); final duration = await session.getDuration(); final output = await session.getOutput(); final logs = await session.getLogs(); final statistics = await (session as FFmpegSession).getStatistics(); }); ```
Async execution with callbacks ```dart FFmpegKit.executeAsync('-i file1.mp4 -c:v mpeg4 file2.mp4', (Session session) async { // CALLED WHEN SESSION IS EXECUTED }, (Log log) { // CALLED WHEN SESSION PRINTS LOGS }, (Statistics statistics) { // CALLED WHEN SESSION GENERATES STATISTICS }); ```
FFprobe & media information ```dart FFprobeKit.getMediaInformation('').then((session) async { final information = await session.getMediaInformation(); }); ```
Cancel sessions ```dart FFmpegKit.cancel(); // stop all sessions FFmpegKit.cancel(sessionId); // stop a specific session ```
Android โ€” Storage Access Framework (SAF) ```dart // Reading a file FFmpegKitConfig.selectDocumentForRead('*/*').then((uri) { FFmpegKitConfig.getSafParameterForRead(uri!).then((safUrl) { FFmpegKit.executeAsync("-i ${safUrl!} -c:v mpeg4 file2.mp4"); }); }); // Writing to a file FFmpegKitConfig.selectDocumentForWrite('video.mp4', 'video/*').then((uri) { FFmpegKitConfig.getSafParameterForWrite(uri!).then((safUrl) { FFmpegKit.executeAsync("-i file1.mp4 -c:v mpeg4 ${safUrl}"); }); }); ```
Global callbacks & fonts ```dart FFmpegKitConfig.enableLogCallback((log) { final message = log.getMessage(); }); FFmpegKitConfig.enableStatisticsCallback((statistics) { final size = statistics.getSize(); }); FFmpegKitConfig.setFontDirectoryList(["/system/fonts", "/System/Library/Fonts", ""]); ```
## ๐Ÿ“„ License Licensed under **LGPL 3.0** by default. This package additionally includes `GPL v3.0`-licensed components (`x264`, `x265`, `xvidcore`, `vid.stab`) and is therefore effectively **GPL v3.0**. ## ๐Ÿ’ฌ Community & support - ๐Ÿ’™ [Join the Discord](https://discord.gg/8NVwykjA) - โ˜• [Buy me a coffee](https://buymeacoffee.com/sk3llo) - ๐Ÿ› [Report an issue](https://github.com/sk3llo/ffmpeg_kit_flutter/issues)