Skip to content

sk3llo/ffmpeg_kit_flutter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

61 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🎬 FFmpegKit for Flutter β€” Full-GPL

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+.

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.
  • πŸ“± Four platforms β€” Android, iOS, macOS, and Windows (x86_64) behind one API.
  • 🎞️ FFmpeg v8.1.2 with 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.

πŸ“¦ Install

dependencies:
  ffmpeg_kit_flutter_new: ^4.5.0
import 'package:ffmpeg_kit_flutter_new/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 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

πŸš€ Quick start

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()
}

🧩 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
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
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 before flutter run/build windows.

πŸ“– Usage

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 session
Android β€” 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>"]);

πŸ“„ 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

About

Fork of the original FFmpeg Kit library to work with Android V2 bindings and Flutter 3+

Topics

Resources

License

LGPL-3.0, GPL-3.0 licenses found

Licenses found

LGPL-3.0
LICENSE
GPL-3.0
LICENSE.GPLv3

Stars

169 stars

Watchers

5 watching

Forks

Packages

 
 
 

Contributors