Convert Figma logo to code with AI

tanersener logomobile-ffmpeg

FFmpeg for Android, iOS and tvOS. Not maintained anymore. Superseded by FFmpegKit.

3,851
787
3,851
0

Top Related Projects

45,445

Mirror of https://git.ffmpeg.org/ffmpeg.git

FFmpeg Kit for applications. Supports Android, Flutter, iOS, Linux, macOS, React Native and tvOS. Supersedes MobileFFmpeg, flutter_ffmpeg and react-native-ffmpeg.

FFmpegMediaMetadataRetriever provides a unified interface for retrieving frame and meta data from an input media file.

Android java library for FFmpeg binary compiled using https://github.com/writingminds/ffmpeg-android

Quick Overview

Mobile FFmpeg is a collection of FFmpeg libraries and tools for Android and iOS platforms. It provides a comprehensive set of audio and video manipulation capabilities, including encoding, decoding, filtering, and format conversion, optimized for mobile devices.

Pros

  • Supports a wide range of audio and video codecs and formats
  • Optimized for mobile platforms, ensuring efficient performance on resource-constrained devices
  • Offers multiple prebuilt packages with different feature sets to suit various project needs
  • Provides easy-to-use APIs for both Android and iOS development

Cons

  • Large binary size, which may increase app size significantly
  • Complex setup process compared to native mobile audio/video libraries
  • Potential licensing issues due to the inclusion of various codecs and libraries
  • Steep learning curve for developers unfamiliar with FFmpeg

Code Examples

  1. Basic video conversion (Android Java):
FFmpeg.execute("-i input.mp4 -c:v mpeg4 output.mp4");
  1. Extracting audio from video (iOS Swift):
MobileFFmpeg.execute("-i input.mp4 -vn -acodec copy output.m4a")
  1. Applying a video filter (Android Kotlin):
FFmpeg.execute("-i input.mp4 -vf "scale=640:480" output.mp4")
  1. Concatenating multiple videos (iOS Objective-C):
[MobileFFmpeg execute:@"-i input1.mp4 -i input2.mp4 -filter_complex '[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]' -map '[outv]' -map '[outa]' output.mp4"];

Getting Started

  1. Add the Mobile FFmpeg dependency to your project:

    For Android (build.gradle):

    dependencies {
        implementation 'com.arthenica:mobile-ffmpeg-full:4.4'
    }
    

    For iOS (CocoaPods):

    pod 'mobile-ffmpeg-full', '~> 4.4'
    
  2. Import the library in your code:

    Android (Java/Kotlin):

    import com.arthenica.mobileffmpeg.FFmpeg;
    

    iOS (Swift):

    import mobileffmpeg
    
  3. Use the FFmpeg.execute() or MobileFFmpeg.execute() method to run FFmpeg commands in your app.

Competitor Comparisons

45,445

Mirror of https://git.ffmpeg.org/ffmpeg.git

Pros of FFmpeg

  • Comprehensive and widely-used multimedia framework with extensive codec support
  • Active development with frequent updates and improvements
  • Large community support and extensive documentation

Cons of FFmpeg

  • Not optimized for mobile platforms out-of-the-box
  • Requires additional configuration and compilation for mobile use
  • Larger file size and resource footprint compared to mobile-specific solutions

Code Comparison

FFmpeg (standard usage):

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>

// Initialize FFmpeg libraries
av_register_all();
avformat_network_init();

mobile-ffmpeg (mobile-optimized usage):

#include <mobileffmpeg/mobileffmpeg.h>

// Execute FFmpeg command
int result = mobileffmpeg_execute("-i input.mp4 -c:v mpeg4 output.mp4");

mobile-ffmpeg provides a simplified API tailored for mobile development, while FFmpeg offers more granular control but requires more setup. FFmpeg is better suited for desktop and server environments, whereas mobile-ffmpeg is optimized for iOS and Android platforms, offering easier integration and smaller binary sizes for mobile apps.

Pros of FFmpeg-Builds

  • Provides pre-built FFmpeg binaries for multiple platforms (Windows, macOS, Linux)
  • Offers various build configurations, including shared and static libraries
  • Regular updates with the latest FFmpeg versions

Cons of FFmpeg-Builds

  • Limited to desktop platforms, not optimized for mobile devices
  • Lacks specific mobile-oriented features and optimizations
  • May require additional setup for integration into mobile projects

Code Comparison

While both projects are primarily focused on building FFmpeg, they don't have directly comparable code snippets. However, here's an example of how you might use each in a project:

mobile-ffmpeg:

import com.arthenica.mobileffmpeg.FFmpeg;

FFmpeg.execute("-i input.mp4 -c:v libx264 output.mp4");

FFmpeg-Builds:

./ffmpeg -i input.mp4 -c:v libx264 output.mp4

The main difference is that mobile-ffmpeg provides a native API for mobile platforms, while FFmpeg-Builds requires command-line execution or integration with FFmpeg libraries.

FFmpeg Kit for applications. Supports Android, Flutter, iOS, Linux, macOS, React Native and tvOS. Supersedes MobileFFmpeg, flutter_ffmpeg and react-native-ffmpeg.

Pros of ffmpeg-kit

  • More active development and maintenance
  • Broader platform support, including tvOS and Android NDK
  • Enhanced API with additional features and improvements

Cons of ffmpeg-kit

  • Potential learning curve for users migrating from mobile-ffmpeg
  • Slightly larger package size due to additional features

Code Comparison

mobile-ffmpeg:

FFmpeg.execute("-i input.mp4 -c:v mpeg4 output.mp4");

ffmpeg-kit:

FFmpegKit.execute("-i input.mp4 -c:v mpeg4 output.mp4", new FFmpegSessionCompleteCallback() {
    @Override
    public void apply(FFmpegSession session) {
        // Handle completion
    }
});

Key Differences

  1. API Structure: ffmpeg-kit offers a more comprehensive API with additional features and callbacks.
  2. Platform Support: ffmpeg-kit extends support to tvOS and Android NDK.
  3. Maintenance: ffmpeg-kit shows more frequent updates and active development.
  4. Package Size: ffmpeg-kit may have a slightly larger footprint due to additional features.
  5. Migration: Users familiar with mobile-ffmpeg may need to adapt to ffmpeg-kit's API changes.

Conclusion

ffmpeg-kit can be seen as an evolution of mobile-ffmpeg, offering enhanced features and broader platform support. While it may require some adaptation for existing mobile-ffmpeg users, the benefits of active development and expanded capabilities make it a strong choice for most projects requiring FFmpeg functionality on mobile platforms.

FFmpegMediaMetadataRetriever provides a unified interface for retrieving frame and meta data from an input media file.

Pros of FFmpegMediaMetadataRetriever

  • Focused specifically on metadata retrieval, making it more lightweight for this particular use case
  • Simpler API for extracting metadata from media files
  • Better suited for projects that only need metadata extraction functionality

Cons of FFmpegMediaMetadataRetriever

  • Limited to metadata retrieval, lacking the full range of FFmpeg capabilities
  • Less frequently updated compared to mobile-ffmpeg
  • Smaller community and potentially less support

Code Comparison

FFmpegMediaMetadataRetriever:

FFmpegMediaMetadataRetriever mmr = new FFmpegMediaMetadataRetriever();
mmr.setDataSource(path);
String title = mmr.extractMetadata(FFmpegMediaMetadataRetriever.METADATA_KEY_TITLE);
mmr.release();

mobile-ffmpeg:

FFmpeg.execute("-i input.mp4 -f ffmetadata metadata.txt");
// Then parse the metadata.txt file to extract desired information

Summary

FFmpegMediaMetadataRetriever is a more focused tool for metadata extraction, offering a simpler API for this specific task. However, it lacks the versatility of mobile-ffmpeg, which provides a full range of FFmpeg capabilities. mobile-ffmpeg is more actively maintained and has a larger community, but may be overkill for projects only needing metadata retrieval. The choice between the two depends on the specific requirements of your project and whether you need the full FFmpeg toolkit or just metadata extraction functionality.

Android java library for FFmpeg binary compiled using https://github.com/writingminds/ffmpeg-android

Pros of ffmpeg-android-java

  • Simpler setup and integration for Android-specific projects
  • Lightweight and focused on Android use cases
  • Easier to use for developers primarily working with Java on Android

Cons of ffmpeg-android-java

  • Limited platform support (Android-only) compared to mobile-ffmpeg's cross-platform capabilities
  • Fewer features and customization options
  • Less frequent updates and smaller community support

Code Comparison

mobile-ffmpeg:

import com.arthenica.mobileffmpeg.FFmpeg

FFmpeg.execute("-i input.mp4 -c:v mpeg4 output.mp4")

ffmpeg-android-java:

import com.github.hiteshsondhi88.libffmpeg.FFmpeg;

FFmpeg ffmpeg = FFmpeg.getInstance(context);
ffmpeg.execute(cmd, new ExecuteBinaryResponseHandler() {
    // Handle response
});

Both libraries provide ways to execute FFmpeg commands, but mobile-ffmpeg offers a more straightforward approach with a single line of code. ffmpeg-android-java requires more setup and uses a callback-based system, which may be more familiar to Android developers but can lead to more verbose code.

mobile-ffmpeg provides a wider range of features and supports multiple platforms, making it more versatile for cross-platform development. However, ffmpeg-android-java may be a simpler choice for Android-specific projects that don't require extensive customization or cross-platform support.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

MobileFFmpeg Financial Contributors on Open Collective GitHub release Maven Central CocoaPods Build Status

FFmpeg for Android, iOS and tvOS.

Not maintained anymore as explained in What’s next for MobileFFmpeg?. Superseded by FFmpegKit.

1. Features

  • Includes both FFmpeg and FFprobe

  • Use binaries available at Github/Maven Central/CocoaPods or build your own version with external libraries you need

  • Supports

    • Android, iOS and tvOS

    • FFmpeg v3.4.x, v4.0.x, v4.1, v4.2 , v4.3 and v4.4-dev releases

    • 29 external libraries

      chromaprint, fontconfig, freetype, fribidi, gmp, gnutls, kvazaar, lame, libaom, libass, libiconv, libilbc, libtheora, libvorbis, libvpx, libwebp, libxml2, opencore-amr, openh264, opus, sdl, shine, snappy, soxr, speex, tesseract, twolame, vo-amrwbenc, wavpack

    • 5 external libraries with GPL license

      rubberband, vid.stab, x264, x265, xvidcore

    • Concurrent execution

  • Exposes both FFmpeg library and MobileFFmpeg wrapper library capabilities

  • Includes cross-compile instructions for 47 open-source libraries

    chromaprint, expat, ffmpeg, fontconfig, freetype, fribidi, giflib, gmp, gnutls, kvazaar, lame, leptonica, libaom, libass, libiconv, libilbc, libjpeg, libjpeg-turbo, libogg, libpng, libsamplerate, libsndfile, libtheora, libuuid, libvorbis, libvpx, libwebp, libxml2, nettle, opencore-amr, openh264, opus, rubberband, sdl, shine, snappy, soxr, speex, tesseract, tiff, twolame, vid.stab, vo-amrwbenc, wavpack, x264, x265, xvidcore

  • Licensed under LGPL 3.0, can be customized to support GPL v3.0

1.1 Android

  • Builds arm-v7a, arm-v7a-neon, arm64-v8a, x86 and x86_64 architectures
  • Supports zlib and MediaCodec system libraries
  • Camera access on supported devices
  • Builds shared native libraries (.so)
  • Creates Android archive with .aar extension
  • Supports API Level 16+

1.2 iOS

  • Builds armv7, armv7s, arm64, arm64e, i386, x86_64 and x86_64 (Mac Catalyst) architectures
  • Supports bzip2, iconv, libuuid, zlib system libraries and AudioToolbox, VideoToolbox, AVFoundation system frameworks
  • Objective-C API
  • Camera access
  • ARC enabled library
  • Built with -fembed-bitcode flag
  • Creates static frameworks, static xcframeworks and static universal (fat) libraries (.a)
  • Supports iOS SDK 9.3 or later

1.3 tvOS

  • Builds arm64 and x86_64 architectures
  • Supports bzip2, iconv, libuuid, zlib system libraries and AudioToolbox, VideoToolbox system frameworks
  • Objective-C API
  • ARC enabled library
  • Built with -fembed-bitcode flag
  • Creates static frameworks and static universal (fat) libraries (.a)
  • Supports tvOS SDK 9.2 or later

2. Using

Prebuilt binaries are available at Github, Maven Central and CocoaPods.

2.1 Packages

There are eight different mobile-ffmpeg packages. Below you can see which system libraries and external libraries are enabled in each of them.

Please remember that some parts of FFmpeg are licensed under the GPL and only GPL licensed mobile-ffmpeg packages include them.

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
wavpack
fontconfig
freetype
fribidi
kvazaar
libaom
libass
libiconv
libtheora
libvpx
libwebp
snappy
fontconfig
freetype
fribidi
gmp
gnutls
kvazaar
lame
libaom
libass
libiconv
libilbc
libtheora
libvorbis
libvpx
libwebp
libxml2
opencore-amr
opus
shine
snappy
soxr
speex
twolame
vo-amrwbenc
wavpack
fontconfig
freetype
fribidi
gmp
gnutls
kvazaar
lame
libaom
libass
libiconv
libilbc
libtheora
libvorbis
libvpx
libwebp
libxml2
opencore-amr
opus
shine
snappy
soxr
speex
twolame
vid.stab
vo-amrwbenc
wavpack
x264
x265
xvidcore
android system libraries zlib
MediaCodec
ios system libraries zlib
AudioToolbox
AVFoundation
iconv
VideoToolbox
bzip2
tvos system libraries zlib
AudioToolbox
iconv
VideoToolbox
bzip2
  • libilbc, opus, snappy, x264 and xvidcore are supported since v1.1

  • libaom and soxr are supported since v2.0

  • chromaprint, vid.stab and x265 are supported since v2.1

  • sdl, tesseract, twolame external libraries; zlib, MediaCodec Android system libraries; bzip2, zlib iOS system libraries and AudioToolbox, VideoToolbox, AVFoundation iOS system frameworks are supported since v3.0

  • Since v4.2, chromaprint, sdl and tesseract libraries are not included in binary releases. You can still build them and include in your releases

  • AVFoundation is not available on tvOS, VideoToolbox is not available on tvOS LTS releases

  • Since v4.3.1, iOS and tvOS releases started to use iconv system library instead of iconv external library

  • vo-amrwbenc is supported since v4.4

2.2 Android

  • For versions 4.4 and 4.4.LTS, add mavenCentral() to your build.gradle and make sure that it is listed before jcenter()
  • For 4.3.2 and older releases, add jcenter()
    repositories {
        mavenCentral()
    }
    
  1. Add MobileFFmpeg dependency to your build.gradle in mobile-ffmpeg-<package name> pattern.

    dependencies {
        implementation 'com.arthenica:mobile-ffmpeg-full:4.4'
    }
    
  2. Execute synchronous FFmpeg commands.

    import com.arthenica.mobileffmpeg.Config;
    import com.arthenica.mobileffmpeg.FFmpeg;
    
    int rc = FFmpeg.execute("-i file1.mp4 -c:v mpeg4 file2.mp4");
    
    if (rc == RETURN_CODE_SUCCESS) {
        Log.i(Config.TAG, "Command execution completed successfully.");
    } else if (rc == RETURN_CODE_CANCEL) {
        Log.i(Config.TAG, "Command execution cancelled by user.");
    } else {
        Log.i(Config.TAG, String.format("Command execution failed with rc=%d and the output below.", rc));
        Config.printLastCommandOutput(Log.INFO);
    }
    
  3. Execute asynchronous FFmpeg commands.

    import com.arthenica.mobileffmpeg.Config;
    import com.arthenica.mobileffmpeg.FFmpeg;
    
    long executionId = FFmpeg.executeAsync("-i file1.mp4 -c:v mpeg4 file2.mp4", new ExecuteCallback() {
    
        @Override
        public void apply(final long executionId, final int returnCode) {
            if (returnCode == RETURN_CODE_SUCCESS) {
                Log.i(Config.TAG, "Async command execution completed successfully.");
            } else if (returnCode == RETURN_CODE_CANCEL) {
                Log.i(Config.TAG, "Async command execution cancelled by user.");
            } else {
                Log.i(Config.TAG, String.format("Async command execution failed with returnCode=%d.", returnCode));
            }
        }
    });
    
  4. Execute FFprobe commands.

    import com.arthenica.mobileffmpeg.Config;
    import com.arthenica.mobileffmpeg.FFprobe;
    
    int rc = FFprobe.execute("-i file1.mp4");
    
    if (rc == RETURN_CODE_SUCCESS) {
        Log.i(Config.TAG, "Command execution completed successfully.");
    } else {
        Log.i(Config.TAG, String.format("Command execution failed with rc=%d and the output below.", rc));
        Config.printLastCommandOutput(Log.INFO);
    }
    
  5. Check execution output later.

    int rc = Config.getLastReturnCode();
    
    if (rc == RETURN_CODE_SUCCESS) {
        Log.i(Config.TAG, "Command execution completed successfully.");
    } else if (rc == RETURN_CODE_CANCEL) {
        Log.i(Config.TAG, "Command execution cancelled by user.");
    } else {
        Log.i(Config.TAG, String.format("Command execution failed with rc=%d and the output below.", rc));
        Config.printLastCommandOutput(Log.INFO);
    }
    
  6. Stop ongoing FFmpeg operations.

    • Stop all executions
      FFmpeg.cancel();
      
    • Stop a specific execution
      FFmpeg.cancel(executionId);
      
  7. Get media information for a file.

    MediaInformation info = FFprobe.getMediaInformation("<file path or uri>");
    
  8. Record video using Android camera.

    FFmpeg.execute("-f android_camera -i 0:0 -r 30 -pixel_format bgr0 -t 00:00:05 <record file path>");
    
  9. Enable log callback.

    Config.enableLogCallback(new LogCallback() {
        public void apply(LogMessage message) {
            Log.d(Config.TAG, message.getText());
        }
    });
    
  10. Enable statistics callback.

    Config.enableStatisticsCallback(new StatisticsCallback() {
        public void apply(Statistics newStatistics) {
            Log.d(Config.TAG, String.format("frame: %d, time: %d", newStatistics.getVideoFrameNumber(), newStatistics.getTime()));
        }
    });
    
  11. Ignore the handling of a signal.

    Config.ignoreSignal(Signal.SIGXCPU);
    
  12. List ongoing executions.

    final List<FFmpegExecution> ffmpegExecutions = FFmpeg.listExecutions();
    for (int i = 0; i < ffmpegExecutions.size(); i++) {
        FFmpegExecution execution = ffmpegExecutions.get(i);
        Log.d(TAG, String.format("Execution %d = id:%d, startTime:%s, command:%s.", i, execution.getExecutionId(), execution.getStartTime(), execution.getCommand()));
    }
    
  13. Set default log level.

    Config.setLogLevel(Level.AV_LOG_FATAL);
    
  14. Register custom fonts directory.

    Config.setFontDirectory(this, "<folder with fonts>", Collections.EMPTY_MAP);
    

2.3 iOS / tvOS

  1. Add MobileFFmpeg dependency to your Podfile in mobile-ffmpeg-<package name> pattern.

    • iOS
    pod 'mobile-ffmpeg-full', '~> 4.4'
    
    • tvOS
    pod 'mobile-ffmpeg-tvos-full', '~> 4.4'
    
  2. Execute synchronous FFmpeg commands.

    #import <mobileffmpeg/MobileFFmpegConfig.h>
    #import <mobileffmpeg/MobileFFmpeg.h>
    
    int rc = [MobileFFmpeg execute: @"-i file1.mp4 -c:v mpeg4 file2.mp4"];
    
    if (rc == RETURN_CODE_SUCCESS) {
        NSLog(@"Command execution completed successfully.\n");
    } else if (rc == RETURN_CODE_CANCEL) {
        NSLog(@"Command execution cancelled by user.\n");
    } else {
        NSLog(@"Command execution failed with rc=%d and output=%@.\n", rc, [MobileFFmpegConfig getLastCommandOutput]);
    }
    
  3. Execute asynchronous FFmpeg commands.

    #import <mobileffmpeg/MobileFFmpegConfig.h>
    #import <mobileffmpeg/MobileFFmpeg.h>
    
    long executionId = [MobileFFmpeg executeAsync:@"-i file1.mp4 -c:v mpeg4 file2.mp4" withCallback:self];
    
    - (void)executeCallback:(long)executionId :(int)returnCode {
        if (rc == RETURN_CODE_SUCCESS) {
            NSLog(@"Async command execution completed successfully.\n");
        } else if (rc == RETURN_CODE_CANCEL) {
            NSLog(@"Async command execution cancelled by user.\n");
        } else {
            NSLog(@"Async command execution failed with rc=%d.\n", rc);
        }
    }
    
  4. Execute FFprobe commands.

    #import <mobileffmpeg/MobileFFmpegConfig.h>
    #import <mobileffmpeg/MobileFFprobe.h>
    
    int rc = [MobileFFprobe execute: @"-i file1.mp4"];
    
    if (rc == RETURN_CODE_SUCCESS) {
        NSLog(@"Command execution completed successfully.\n");
    } else if (rc == RETURN_CODE_CANCEL) {
        NSLog(@"Command execution cancelled by user.\n");
    } else {
        NSLog(@"Command execution failed with rc=%d and output=%@.\n", rc, [MobileFFmpegConfig getLastCommandOutput]);
    }
    
  5. Check execution output later.

    int rc = [MobileFFmpegConfig getLastReturnCode];
    NSString *output = [MobileFFmpegConfig getLastCommandOutput];
    
    if (rc == RETURN_CODE_SUCCESS) {
        NSLog(@"Command execution completed successfully.\n");
    } else if (rc == RETURN_CODE_CANCEL) {
        NSLog(@"Command execution cancelled by user.\n");
    } else {
        NSLog(@"Command execution failed with rc=%d and output=%@.\n", rc, output);
    }
    
  6. Stop ongoing FFmpeg operations.

    • Stop all executions
      [MobileFFmpeg cancel];
      
      
    • Stop a specific execution
      [MobileFFmpeg cancel:executionId];
      
  7. Get media information for a file.

    MediaInformation *mediaInformation = [MobileFFprobe getMediaInformation:@"<file path or uri>"];
    
  8. Record video and audio using iOS camera. This operation is not supported on tvOS since AVFoundation is not available on tvOS.

    [MobileFFmpeg execute: @"-f avfoundation -r 30 -video_size 1280x720 -pixel_format bgr0 -i 0:0 -vcodec h264_videotoolbox -vsync 2 -f h264 -t 00:00:05 %@", recordFilePath];
    
  9. Enable log callback.

    [MobileFFmpegConfig setLogDelegate:self];
    
    - (void)logCallback:(long)executionId :(int)level :(NSString*)message {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"%@", message);
        });
    }
    
  10. Enable statistics callback.

    [MobileFFmpegConfig setStatisticsDelegate:self];
    
    - (void)statisticsCallback:(Statistics *)newStatistics {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"frame: %d, time: %d\n", newStatistics.getVideoFrameNumber, newStatistics.getTime);
        });
    }
    
  11. Ignore the handling of a signal.

    [MobileFFmpegConfig ignoreSignal:SIGXCPU];
    
  12. List ongoing executions.

    NSArray* ffmpegExecutions = [MobileFFmpeg listExecutions];
    for (int i = 0; i < [ffmpegExecutions count]; i++) {
        FFmpegExecution* execution = [ffmpegExecutions objectAtIndex:i];
        NSLog(@"Execution %d = id: %ld, startTime: %@, command: %@.\n", i, [execution getExecutionId], [execution getStartTime], [execution getCommand]);
    }
    
  13. Set default log level.

    [MobileFFmpegConfig setLogLevel:AV_LOG_FATAL];
    
  14. Register custom fonts directory.

    [MobileFFmpegConfig setFontDirectory:@"<folder with fonts>" with:nil];
    

2.4 Manual Installation

2.4.1 Android

You can import MobileFFmpeg aar packages in Android Studio using the File -> New -> New Module -> Import .JAR/.AAR Package menu.

2.4.2 iOS / tvOS

iOS and tvOS frameworks can be installed manually using the Importing Frameworks guide. If you want to use universal binaries please refer to Using Universal Binaries guide.

2.5 Test Application

You can see how MobileFFmpeg is used inside an application by running test applications provided. There is an Android test application under the android/test-app folder, an iOS test application under the ios/test-app folder and a tvOS test application under the tvos/test-app folder.

All applications are identical and supports command execution, video encoding, accessing https, encoding audio, burning subtitles, video stabilisation, pipe operations and concurrent command execution.

3. Versions

MobileFFmpeg version number is aligned with FFmpeg since version 4.2.

In previous versions, MobileFFmpeg version of a release and FFmpeg version included in that release was different. The following table lists FFmpeg versions used in MobileFFmpeg releases.

  • dev part in FFmpeg version number indicates that FFmpeg source is pulled from the FFmpeg master branch. Exact version number is obtained using git describe --tags.
MobileFFmpeg VersionFFmpeg VersionRelease Date
4.44.4-dev-416Jul 25, 2020
4.4.LTS4.4-dev-416Jul 24, 2020
4.3.24.3-dev-2955Apr 15, 2020
4.3.14.3-dev-1944Jan 25, 2020
4.3.1.LTS4.3-dev-1944Jan 25, 2020
4.34.3-dev-1181Oct 27, 2019
4.2.24.2-dev-1824July 3, 2019
4.2.2.LTS4.2-dev-1824July 3, 2019
4.2.14.2-dev-1156Apr 2, 2019
4.24.2-dev-480Jan 3, 2019
4.2.LTS4.2-dev-480Jan 3, 2019
3.14.1-10Dec 11, 2018
3.04.1-dev-1517Oct 25, 2018
2.24.0.3Nov 10, 2018
2.1.14.0.2Sep 19, 2018
2.14.0.2Sep 5, 2018
2.04.0.1Jun 30, 2018
1.23.4.4Aug 30, 2018
1.13.4.2Jun 18, 2018
1.03.4.2Jun 6, 2018

4. LTS Releases

Starting from v4.2, MobileFFmpeg binaries are published in two different variants: Main Release and LTS Release.

  • Main releases include complete functionality of the library and support the latest SDK/API features.

  • LTS releases are customized to support a wider range of devices. They are built using older API/SDK versions, so some features are not available on them.

This table shows the differences between two variants.

Main ReleaseLTS Release
Android API Level2416
Android Camera AccessYes-
Android Architecturesarm-v7a-neon
arm64-v8a
x86
x86-64
arm-v7a
arm-v7a-neon
arm64-v8a
x86
x86-64
Xcode Support10.17.3.1
iOS SDK12.19.3
iOS AVFoundationYes-
iOS Architecturesarm64
arm64e1
x86-64
x86-64-mac-catalyst2
armv7
arm64
i386
x86-64
tvOS SDK10.29.2
tvOS Architecturesarm64
x86-64
arm64
x86-64

1 - Included until v4.3.2

2 - Included since v4.3.2

5. Building

Build scripts from master and development branches are tested periodically. See the latest status from the table below.

branchstatus
masterBuild Status
developmentBuild Status

5.1 Prerequisites

  1. Use your package manager (apt, yum, dnf, brew, etc.) to install the following packages.

    autoconf automake libtool pkg-config curl cmake gcc gperf texinfo yasm nasm bison autogen patch git
    

Some of these packages are not mandatory for the default build. Please visit Android Prerequisites, iOS Prerequisites and tvOS Prerequisites for the details.

  1. Android builds require these additional packages.

    • Android SDK 4.1 Jelly Bean (API Level 16) or later
    • Android NDK r21 or later with LLDB and CMake
  2. iOS builds need these extra packages and tools.

    • Xcode 7.3.1 or later
    • iOS SDK 9.3 or later
    • Command Line Tools
  3. tvOS builds need these extra packages and tools.

    • Xcode 7.3.1 or later
    • tvOS SDK 9.2 or later
    • Command Line Tools

5.2 Build Scripts

Use android.sh, ios.sh and tvos.sh to build MobileFFmpeg for each platform.

All three scripts support additional options and can be customized to enable/disable specific external libraries and/or architectures. Please refer to wiki pages of android.sh, ios.sh and tvos.sh to see all available build options.

5.2.1 Android
export ANDROID_HOME=<Android SDK Path>
export ANDROID_NDK_ROOT=<Android NDK Path>
./android.sh
5.2.2 iOS
./ios.sh
5.2.3 tvOS
./tvos.sh
5.2.4 Building LTS Binaries

Use --lts option to build lts binaries for each platform.

5.3 Build Output

All libraries created by the top level build scripts (android.sh, ios.sh and tvos.sh) can be found under the prebuilt directory.

  • Android archive (.aar file) is located under the android-aar folder
  • iOS frameworks are located under the ios-framework folder
  • iOS xcframeworks are located under the ios-xcframework folder
  • iOS universal binaries are located under the ios-universal folder
  • tvOS frameworks are located under the tvos-framework folder
  • tvOS universal binaries are located under the tvos-universal folder

5.4 GPL Support

It is possible to enable GPL licensed libraries x264, xvidcore since v1.1; vid.stab, x265 since v2.1 and rubberband since v4.3.2 from the top level build scripts. Their source code is not included in the repository and downloaded when enabled.

5.5 External Libraries

build directory includes build scripts of all external libraries. Two scripts exist for each external library, one for Android and one for iOS / tvOS. Each of these two scripts contains options/flags used to cross-compile the library on the specified mobile platform.

CPU optimizations (ASM) are enabled for most of the external libraries. Details and exceptions can be found under the ASM Support wiki page.

6. Documentation

A more detailed documentation is available at Wiki.

7. Contributors

7.1 Code Contributors

This project exists thanks to all the people who contribute. [Contribute].

7.2 Financial Contributors

Become a financial contributor and help us sustain our community. [Contribute]

7.2.1 Individuals

7.2.2 Organizations

Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]

8. License

MobileFFmpeg is licensed under the LGPL v3.0. However, if source code is built using the optional --enable-gpl flag or prebuilt binaries with -gpl postfix are used, then MobileFFmpeg is subject to the GPL v3.0 license.

The source code of all external libraries included is in compliance with their individual licenses.

openh264 source code included in this repository is licensed under the 2-clause BSD License but this license does not cover the MPEG LA licensing fees. If you build mobile-ffmpeg with openh264 and distribute that library, then you are subject to pay MPEG LA licensing fees. Refer to OpenH264 FAQ page for the details. Please note that mobile-ffmpeg does not publish a binary with openh264 inside.

strip-frameworks.sh script included and distributed (until v4.x) is published under the Apache License version 2.0.

In test applications; embedded fonts are licensed under the SIL Open Font License, other digital assets are published in the public domain.

Please visit License page for the details.

9. Patents

It is not clearly explained in their documentation but it is believed that FFmpeg, kvazaar, x264 and x265 include algorithms which are subject to software patents. If you live in a country where software algorithms are patentable then you'll probably need to pay royalty fees to patent holders. We are not lawyers though, so we recommend that you seek legal advice first. See FFmpeg Patent Mini-FAQ.

openh264 clearly states that it uses patented algorithms. Therefore, if you build mobile-ffmpeg with openh264 and distribute that library, then you are subject to pay MPEG LA licensing fees. Refer to OpenH264 FAQ page for the details.

10. Contributing

Feel free to submit issues or pull requests.

Please note that master branch includes only the latest released source code. Changes planned for the next release are implemented under the development branch. Therefore, if you want to create a pull request, please open it against the development.

11. See Also