MobileFFmpeg

FFmpeg for Android, iOS and tvOS
1. Features
-
Includes both
FFmpeg
andFFprobe
-
Use binaries available at
Github
/JCenter
/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
andv4.3-dev
releases -
28 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
,wavpack
-
4 external libraries with GPL license
vid.stab
,x264
,x265
,xvidcore
-
Concurrent execution
-
-
Exposes both FFmpeg library and MobileFFmpeg wrapper library capabilities
-
Includes cross-compile instructions for 44 open-source libraries
chromaprint
,expat
,ffmpeg
,fontconfig
,freetype
,fribidi
,giflib
,gmp
,gnutls
,kvazaar
,lame
,leptonica
,libaom
,libass
,libiconv
,libilbc
,libjpeg
,libjpeg-turbo
,libogg
,libpng
,libsndfile
,libtheora
,libuuid
,libvorbis
,libvpx
,libwebp
,libxml2
,nettle
,opencore-amr
,openh264
,opus
,sdl
,shine
,snappy
,soxr
,speex
,tesseract
,tiff
,twolame
,vid.stab
,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
andx86_64
architectures - Supports
zlib
andMediaCodec
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
andx86_64
architectures - Supports
bzip2
,zlib
,iconv
system libraries andAudioToolbox
,CoreImage
,VideoToolbox
,AVFoundation
system frameworks - Objective-C API
- Camera access
ARC
enabled library- Built with
-fembed-bitcode
flag - Creates static framework and static universal (fat) library (.a)
- Supports
iOS SDK 9.3
or later
1.3 tvOS
- Builds
arm64
andx86_64
architectures - Supports
bzip2
,zlib
,iconv
system libraries andAudioToolbox
,CoreImage
,VideoToolbox
system frameworks - Objective-C API
ARC
enabled library- Built with
-fembed-bitcode
flag - Creates static framework and static universal (fat) library (.a)
- Supports
tvOS SDK 9.2
or later
2. Using
Published binaries are available at Github, JCenter and CocoaPods.
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.
-
libilbc
,opus
,snappy
,x264
andxvidcore
are supported sincev1.1
-
libaom
andsoxr
are supported sincev2.0
-
chromaprint
,vid.stab
andx265
are supported sincev2.1
-
sdl
,tesseract
,twolame
external libraries;zlib
,MediaCodec
Android system libraries;bzip2
,zlib
iOS system libraries andAudioToolbox
,CoreImage
,VideoToolbox
,AVFoundation
iOS system frameworks are supported sincev3.0
-
Since
v4.2
,chromaprint
,sdl
andtesseract
libraries are not included in binary releases. You can still build them and include in your releases -
AVFoundation
is not available ontvOS
,VideoToolbox
is not available ontvOS
LTS releases -
Since
v4.3.1
,iOS
andtvOS
releases started to useiconv
system library instead oficonv
external library
2.1 Android
-
Add MobileFFmpeg dependency to your
build.gradle
inmobile-ffmpeg-<package name>
formatdependencies { implementation 'com.arthenica:mobile-ffmpeg-full:4.3.1' }
-
Execute 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); }
-
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); }
-
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); }
-
Stop an ongoing FFmpeg operation.
FFmpeg.cancel();
-
Get media information for a file.
MediaInformation info = FFprobe.getMediaInformation("<file path or uri>");
-
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>");
-
List enabled external libraries.
List<String> externalLibraries = Config.getExternalLibraries();
-
Enable log callback.
Config.enableLogCallback(new LogCallback() { public void apply(LogMessage message) { Log.d(Config.TAG, message.getText()); } });
-
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())); } });
-
Set log level.
Config.setLogLevel(Level.AV_LOG_FATAL);
-
Register custom fonts directory.
Config.setFontDirectory(this, "<folder with fonts>", Collections.EMPTY_MAP);
2.2 iOS / tvOS
-
Add MobileFFmpeg dependency to your
Podfile
inmobile-ffmpeg-<package name>
format- iOS
pod 'mobile-ffmpeg-full', '~> 4.3.1'
- tvOS
pod 'mobile-ffmpeg-tvos-full', '~> 4.3.1'
-
Execute 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]); }
-
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]); }
-
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); }
-
Stop an ongoing FFmpeg operation.
[MobileFFmpeg cancel];
-
Get media information for a file.
MediaInformation *mediaInformation = [MobileFFprobe getMediaInformation:@"<file path or uri>"];
-
Record video and audio using iOS camera. This operation is not supported on
tvOS
sinceAVFoundation
is not available ontvOS
.[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];
-
List enabled external libraries.
NSArray *externalLibraries = [MobileFFmpegConfig getExternalLibraries];
-
Enable log callback.
[MobileFFmpegConfig setLogDelegate:self]; - (void)logCallback: (int)level :(NSString*)message { dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%@", message); }); }
-
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); }); }
-
Set log level.
[MobileFFmpegConfig setLogLevel:AV_LOG_FATAL];
-
Register custom fonts directory.
[MobileFFmpegConfig setFontDirectory:@"<folder with fonts>" with:nil];
2.3 Manual Installation
2.3.1 Android
You can import MobileFFmpeg
aar packages in Android Studio
using the File
-> New
-> New Module
-> Import .JAR/.AAR Package
menu.
2.3.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.4 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 stabilization and pipe operations.
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 inFFmpeg
version number indicates thatFFmpeg
source is pulled from theFFmpeg
master
branch.
Exact version number is obtained usinggit describe --tags
.