Run FFmpeg & FFprobe on Android, iOS, macOS and Windows from a single Dart API.
A maintained fork of the original FFmpegKit, updated for the Android V2 embedding and Flutter 3+.
- π§° Full toolkit β both
FFmpegandFFprobe, with per-session logs, statistics and callbacks. - π± Four platforms β
Android,iOS,macOS, andWindows(x86_64) behind one API. - ποΈ FFmpeg
v8.1.2with VideoToolbox hardware acceleration on iOS & macOS. - ποΈ Android SAF β process Storage Access Framework URIs directly.
- π External libraries β see the enabled-libraries table 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.
dependencies:
ffmpeg_kit_flutter_new: ^4.5.0import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart';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 |
Smallest build β core FFmpeg only |
_min_gpl |
Minimal + GPL codecs (x264/x265/xvid/vid.stab) |
_https |
Adds TLS (gnutls) for https:// inputs |
_https_gpl |
HTTPS + GPL codecs |
_audio |
Audio-focused (mp3, opus, vorbis, speex, β¦) |
_video |
Video-focused (dav1d, vpx, theora, webp, β¦) |
_full |
Everything except GPL codecs |
ffmpeg_kit_flutter_new (this one) |
Full + GPL β every library |
import 'package:ffmpeg_kit_flutter_new/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()
}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 |
| macos system libraries | bzip2 AudioToolbox AVFoundation Core Image iconv OpenCL OpenGL VideoToolbox zlib |
|||||||
| Android API Level |
Kotlin Min Version |
iOS Min Target |
macOS Min Target |
Windows |
|---|---|---|---|---|
| 24 | 1.8.22 | 14.0 | 10.15 | 10+ (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 beforeflutter run/build windows.
Execute a command & read the result
import 'package:ffmpeg_kit_flutter_new/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
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
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
FFprobeKit.getMediaInformation('<file path or url>').then((session) async {
final information = await session.getMediaInformation();
});Cancel sessions
FFmpegKit.cancel(); // stop all sessions
FFmpegKit.cancel(sessionId); // stop a specific sessionAndroid β Storage Access Framework (SAF)
// 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
FFmpegKitConfig.enableLogCallback((log) { final message = log.getMessage(); });
FFmpegKitConfig.enableStatisticsCallback((statistics) { final size = statistics.getSize(); });
FFmpegKitConfig.setFontDirectoryList(["/system/fonts", "/System/Library/Fonts", "<folder with fonts>"]);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.
- π Join the Discord
- β Buy me a coffee
- π Report an issue