ffmpeg_kit_flutter_new 1.5.0 copy "ffmpeg_kit_flutter_new: ^1.5.0" to clipboard
ffmpeg_kit_flutter_new: ^1.5.0 copied to clipboard

FFmpeg Kit for Flutter with Full GPL and updated bindings. Supports Android, iOS and macOS platforms.

FFmpegKit for Flutter pub #

Upgraded version of the original FFmpegKit. #

1. Features #

  • Updated Android and MacOS bindings to work with Flutter 3.29

  • Includes both FFmpeg and FFprobe

  • Supports

    • Android, iOS and macOS
  • FFmpeg v6.0.2-LTS

  • arm-v7a, arm-v7a-neon, arm64-v8a, x86 and x86_64 architectures on Android

    • Android API Level 24 or later
    • armv7, armv7s, arm64, arm64-simulator, i386, x86_64, x86_64-mac-catalyst and arm64-mac-catalyst
      architectures on iOS
    • iOS SDK 14.0 or later
    • arm64 and x86_64 architectures on macOS
    • macOS SDK 10.15 or later
  • Can process Storage Access Framework (SAF) Uris on Android

  • 25 external libraries

    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

  • 4 external libraries with GPL license

    vid.stab, x264, x265, xvidcore

  • Licensed under LGPL 3.0 by default, some packages licensed by GPL v3.0 effectively

2. Known issues #

Android:

...
Running Gradle task 'assembleDebug'...
*** DOWNLOADING AAR ***
...android/src/main/java/com/arthenica/ffmpegkit/flutter FFmpegSessionExecuteTask.java:5: error: cannot find symbol
import com.arthenica.ffmpegkit.FFmpegKitConfig;
...100 more lines...

The error above is going to happen during the first run only ONCE. It occurs because downloaded .aar cannot be found after Gradle assemble task. Sadly, mentioned .aar cannot be bundled along with the package because of the pub.dev package restrictions and always have to be downloaded first.

3. Installation #

Add ffmpeg_kit_flutter_new as a dependency in your pubspec.yaml file.

dependencies:  
 ffmpeg_kit_flutter_new: 1.5.0

NOTE: Android know issue:

4. Platform Support

The following table shows Android API level, iOS deployment target and macOS deployment target requirements in
ffmpeg_kit_flutter_new releases.

LTS Release
Android
API Level
iOS Minimum
Deployment Target
macOS Minimum
Deployment Target
24 14 10.15

5. Using #

  1. Execute FFmpeg commands.
import 'package:ffmpeg_kit_flutter/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  
    }
});
  1. Each execute call creates a new session. Access every detail about your execution from the session created.
FFmpegKit.execute('-i file1.mp4 -c:v mpeg4 file2.mp4').then((session) async {  
    // Unique session id created for this execution
    final sessionId = session.getSessionId();  
    // Command arguments as a single string
    final command = session.getCommand();  
    // Command arguments
    final commandArguments = session.getArguments();  
    // State of the execution. Shows whether it is still running or completed
    final state = await session.getState();  
    // Return code for completed sessions. Will be undefined if session is still running or FFmpegKit fails to run it
    final returnCode = await session.getReturnCode();  
    final startTime = session.getStartTime();
    final endTime = await session.getEndTime();
    final duration = await session.getDuration();  
    // Console output generated for this execution
    final output = await session.getOutput();  
    // The stack trace if FFmpegKit fails to run a command
    final failStackTrace = await session.getFailStackTrace();  
    // The list of logs generated for this execution
    final logs = await session.getLogs();  
    // The list of statistics generated for this execution (only available on FFmpegSession)
    final statistics = await (session as FFmpegSession).getStatistics();  
});
  1. Execute FFmpeg commands by providing session specific execute/log/session 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  
});
  1. Execute FFprobe commands.
FFprobeKit.execute(ffprobeCommand).then((session) async {  
    // CALLED WHEN SESSION IS EXECUTED  
});  
  1. Get media information for a file/url.
FFprobeKit.getMediaInformation('<file path or url>').then((session) async {  
    final information = await session.getMediaInformation();  
    if (information == null) {  
        // CHECK THE FOLLOWING ATTRIBUTES ON ERROR
        final state = FFmpegKitConfig.sessionStateToString(await session.getState());
        final returnCode = await session.getReturnCode();
        final failStackTrace = await session.getFailStackTrace();
        final duration = await session.getDuration();
        final output = await session.getOutput();
    }
});
  1. Stop ongoing FFmpeg operations.
  • Stop all sessions
FFmpegKit.cancel();
  • Stop a specific session
FFmpegKit.cancel(sessionId);  
  1. (Android) Convert Storage Access Framework (SAF) Uris into paths that can be read or written by
    FFmpegKit and FFprobeKit.
  • 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}");
    });
});  
  1. Get previous FFmpeg, FFprobe and MediaInformation sessions from the session history.
FFmpegKit.listSessions().then((sessionList) {  
    sessionList.forEach((session) {
        final sessionId = session.getSessionId();
    });
});  
FFprobeKit.listFFprobeSessions().then((sessionList) {
    sessionList.forEach((session) {
        final sessionId = session.getSessionId();
    });
});  
FFprobeKit.listMediaInformationSessions().then((sessionList) {
    sessionList.forEach((session) {
        final sessionId = session.getSessionId();
    });
});
  1. Enable global callbacks.
  • Session type specific Complete Callbacks, called when an async session has been completed
FFmpegKitConfig.enableFFmpegSessionCompleteCallback((session) {
    final sessionId = session.getSessionId();
});  
FFmpegKitConfig.enableFFprobeSessionCompleteCallback((session) {
    final sessionId = session.getSessionId();
});  
FFmpegKitConfig.enableMediaInformationSessionCompleteCallback((session) {
    final sessionId = session.getSessionId();
});  
  • Log Callback, called when a session generates logs
FFmpegKitConfig.enableLogCallback((log) {  
    final message = log.getMessage();
});
  • Statistics Callback, called when a session generates statistics
FFmpegKitConfig.enableStatisticsCallback((statistics) {  
    final size = statistics.getSize();
});  
  1. Register system fonts and custom font directories.
FFmpegKitConfig.setFontDirectoryList(["/system/fonts", "/System/Library/Fonts", "<folder with fonts>"]);
34
likes
160
points
4.88k
downloads

Publisher

verified publisherantonkarpenko.com

Weekly Downloads

FFmpeg Kit for Flutter with Full GPL and updated bindings. Supports Android, iOS and macOS platforms.

Repository (GitHub)

Documentation

API reference

License

LGPL-3.0 (license)

Dependencies

ffmpeg_kit_flutter_android, ffmpeg_kit_flutter_platform_interface, flutter

More

Packages that depend on ffmpeg_kit_flutter_new