FFmpeg for Android, iOS and tvOS
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
and v4.2-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
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
arm-v7a
, arm-v7a-neon
, arm64-v8a
, x86
and x86_64
architectureszlib
and MediaCodec
system librariesAPI Level 16+
armv7
, armv7s
, arm64
, arm64e
, i386
and x86_64
architecturesbzip2
, zlib
system libraries and AudioToolbox
, CoreImage
, VideoToolbox
, AVFoundation
system frameworksARC
enabled library-fembed-bitcode
flagiOS SDK 9.3
or laterarm64
and x86_64
architecturesbzip2
, zlib
system libraries and AudioToolbox
, CoreImage
, VideoToolbox
system frameworksARC
enabled library-fembed-bitcode
flagtvOS SDK 9.2
or laterPublished 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.
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 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 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 wavpack x264 x265 xvidcore |
android system libraries | zlib MediaCodec |
|||||||
ios system libraries | zlib AudioToolbox AVFoundation CoreImage VideoToolbox bzip2 |
|||||||
tvos system libraries | zlib AudioToolbox CoreImage 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
, CoreImage
, 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
Add MobileFFmpeg dependency to your build.gradle
in mobile-ffmpeg-<package name>
format
dependencies {
implementation 'com.arthenica:mobile-ffmpeg-min:4.2.2'
}
Execute commands.
import com.arthenica.mobileffmpeg.FFmpeg;
FFmpeg.execute("-i file1.mp4 -c:v mpeg4 file2.mp4");
Check execution output.
int rc = FFmpeg.getLastReturnCode();
String output = FFmpeg.getLastCommandOutput();
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 output=%s.", rc, output));
}
Stop an ongoing operation.
FFmpeg.cancel();
Get media information for a file.
MediaInformation info = FFmpeg.getMediaInformation("<file path or uri>");
Record video and audio 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);
Add MobileFFmpeg dependency to your Podfile
in mobile-ffmpeg-<package name>
format
pod 'mobile-ffmpeg-min', '~> 4.2.2'
pod 'mobile-ffmpeg-tv-min', '~> 4.2.2'
Execute commands.
#import <mobileffmpeg/MobileFFmpeg.h>
[MobileFFmpeg execute: @"-i file1.mp4 -c:v mpeg4 file2.mp4"];
Check execution output.
int rc = [MobileFFmpeg getLastReturnCode];
NSString *output = [MobileFFmpeg 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 operation.
[MobileFFmpeg cancel];
Get media information for a file.
MediaInformation *mediaInformation = [MobileFFmpeg getMediaInformation:@"<file path or uri>"];
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];
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];
You can import MobileFFmpeg
aar packages in Android Studio
using the File
-> New
-> New Module
-> Import .JAR/.AAR Package
menu.
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.
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.
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 Version | FFmpeg Version | Release Date |
---|---|---|
4.2.2 | 4.2-dev-1824 | July 3, 2019 |
4.2.2.LTS | 4.2-dev-1824 | July 3, 2019 |
4.2.1 | 4.2-dev-1156 | Apr 2, 2019 |
4.2 | 4.2-dev-480 | Jan 3, 2019 |
4.2.LTS | 4.2-dev-480 | Jan 3, 2019 |
3.1 | 4.1-10 | Dec 11, 2018 |
3.0 | 4.1-dev-1517 | Oct 25, 2018 |
2.2 | 4.0.3 | Nov 10, 2018 |
2.1.1 | 4.0.2 | Sep 19, 2018 |
2.1 | 4.0.2 | Sep 5, 2018 |
2.0 | 4.0.1 | Jun 30, 2018 |
1.2 | 3.4.4 | Aug 30, 2018 |
1.1 | 3.4.2 | Jun 18, 2018 |
1.0 | 3.4.2 | Jun 6, 2018 |
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 Release | LTS Release | |
---|---|---|
Android API Level | 24 | 16 |
Android Camera Access | Yes | - |
Android Architectures | arm-v7a-neon arm64-v8a x86 x86-64 |
arm-v7a arm-v7a-neon arm64-v8a x86 x86-64 |
Xcode Support | 10.1 | 7.3.1 |
iOS SDK | 12.1 | 9.3 |
iOS Architectures | arm64 arm64e x86-64 |
armv7 arm64 i386 x86-64 |
tvOS SDK | 10.2 | 9.2 |
tvOS Architectures | arm64 x86-64 |
arm64 x86-64 |
Unreleased binaries built from development
branch can be found under the development-snapshot directory.
Please remember that these builds are provided for testing and development purposes only since they are not % 100 tested and may include minor issues.
Build scripts from master
and development
branches are tested periodically. See the latest status from the table below.
branch | status |
---|---|
master | |
development |
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.
Android builds require these additional packages.
iOS builds need these extra packages and tools.
tvOS builds need these extra packages and tools.
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.
export ANDROID_HOME=<Android SDK Path>
export ANDROID_NDK_ROOT=<Android NDK Path>
./android.sh
./ios.sh
./tvos.sh
Use --lts
option to build lts binaries for each platform.
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
folderiOS
frameworks are located under the ios-framework
folderiOS
universal binaries are located under the ios-universal
foldertvOS
frameworks are located under the tvos-framework
foldertvOS
universal binaries are located under the tvos-universal
folderIt is possible to enable GPL licensed libraries x264
, xvidcore
since v1.1
and vid.stab
, x265
since v2.1
from the top level build scripts. Their source code is not included in the repository and downloaded when enabled.
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.
A more detailed documentation is available at Wiki.
This project is licensed under the LGPL v3.0. However, if source code is built using optional --enable-gpl
flag or
prebuilt binaries with -gpl
postfix are used then MobileFFmpeg is subject to the GPL v3.0 license.
Source code of FFmpeg and external libraries is included 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.
If you have any recommendations or ideas to improve it, please feel free to submit issues or pull requests. Any help is appreciated.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。