2020-08-05 03:53:02 +03:00
# FFmpegKit ![GitHub release](https://img.shields.io/badge/release-v4.4-blue.svg) ![Bintray](https://img.shields.io/badge/bintray-v4.4-blue.svg) ![CocoaPods](https://img.shields.io/badge/pod-v4.4-blue.svg) [![Build Status](https://travis-ci.org/tanersener/ffmpeg-kit.svg?branch=master)](https://travis-ci.org/tanersener/ffmpeg-kit)
FFmpeg kit for applications. Supports Android, iOS, tvOS.
< img src = "https://github.com/tanersener/ffmpeg-kit/blob/development/docs/assets/ffmpeg-kit-icon-v4.png" width = "240" >
### 1. Features
- Includes both `FFmpeg` and `FFprobe`
- Use binaries available at `Github` /`JCenter`/`CocoaPods` or build your own version with external libraries you need
- Supports
- Android, iOS and tvOS
- FFmpeg `v4.4-dev` releases
- 29 external libraries
2021-01-30 01:35:05 +02:00
`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` , `dav1d`
2020-08-05 03:53:02 +03:00
- 5 external libraries with GPL license
`rubberband` , `vid.stab` , `x264` , `x265` , `xvidcore`
- Concurrent execution
- Exposes both FFmpeg library and FFmpegKit wrapper library capabilities
2020-11-23 00:51:45 +02:00
- Includes cross-compile instructions for 48 open-source libraries
2020-08-05 03:53:02 +03:00
2021-01-30 01:35:05 +02:00
`chromaprint` , `expat` , `ffmpeg` , `fontconfig` , `freetype` , `fribidi` , `giflib` , `gmp` , `gnutls` , `harfbuzz` , `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` , `dav1d` , `x264` , `x265` , `xvidcore`
2020-08-05 03:53:02 +03:00
- 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 ](https://developer.android.com/ndk/guides/stable_apis#camera )
- Builds shared native libraries (.so)
- Creates Android archives 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 ](https://github.com/tanersener/ffmpeg-kit/releases ), [JCenter ](https://bintray.com/bintray/jcenter ) and [CocoaPods ](https://cocoapods.org ).
#### 2.1 Packages
There are eight different `ffmpeg-kit` packages. Below you can see which system libraries and external libraries are enabled in each of package.
Please remember that some parts of `FFmpeg` are licensed under the `GPL` and only `GPL` licensed `ffmpeg-kit` packages include them.
< table >
< thead >
< tr >
< th align = "center" > < / th >
< th align = "center" > < sup > min< / sup > < / th >
< th align = "center" > < sup > min-gpl< / sup > < / th >
< th align = "center" > < sup > https< / sup > < / th >
< th align = "center" > < sup > https-gpl< / sup > < / th >
< th align = "center" > < sup > audio< / sup > < / th >
< th align = "center" > < sup > video< / sup > < / th >
< th align = "center" > < sup > full< / sup > < / th >
< th align = "center" > < sup > full-gpl< / sup > < / th >
< / tr >
< / thead >
< tbody >
< tr >
< td align = "center" > < sup > external libraries< / sup > < / td >
< td align = "center" > -< / td >
< td align = "center" > < sup > vid.stab< / sup > < br > < sup > x264< / sup > < br > < sup > x265< / sup > < br > < sup > xvidcore< / sup > < / td >
< td align = "center" > < sup > gmp< / sup > < br > < sup > gnutls< / sup > < / td >
< td align = "center" > < sup > gmp< / sup > < br > < sup > gnutls< / sup > < br > < sup > vid.stab< / sup > < br > < sup > x264< / sup > < br > < sup > x265< / sup > < br > < sup > xvidcore< / sup > < / td >
2021-01-30 01:35:05 +02:00
< td align = "center" > < sup > lame< / sup > < br > < sup > libilbc< / sup > < br > < sup > libvorbis< / sup > < br > < sup > opencore-amr< / sup > < br > < sup > opus< / sup > < br > < sup > shine< / sup > < br > < sup > soxr< / sup > < br > < sup > speex< / sup > < br > < sup > twolame< / sup > < br > < sup > vo-amrwbenc< / sup > < br > < sup > dav1d< / sup > < / td >
2020-08-05 03:53:02 +03:00
< td align = "center" > < sup > fontconfig< / sup > < br > < sup > freetype< / sup > < br > < sup > fribidi< / sup > < br > < sup > kvazaar< / sup > < br > < sup > libaom< / sup > < br > < sup > libass< / sup > < br > < sup > libiconv< / sup > < br > < sup > libtheora< / sup > < br > < sup > libvpx< / sup > < br > < sup > libwebp< / sup > < br > < sup > snappy< / sup > < / td >
2021-01-30 01:35:05 +02:00
< td align = "center" > < sup > fontconfig< / sup > < br > < sup > freetype< / sup > < br > < sup > fribidi< / sup > < br > < sup > gmp< / sup > < br > < sup > gnutls< / sup > < br > < sup > kvazaar< / sup > < br > < sup > lame< / sup > < br > < sup > libaom< / sup > < br > < sup > libass< / sup > < br > < sup > libiconv< / sup > < br > < sup > libilbc< / sup > < br > < sup > libtheora< / sup > < br > < sup > libvorbis< / sup > < br > < sup > libvpx< / sup > < br > < sup > libwebp< / sup > < br > < sup > libxml2< / sup > < br > < sup > opencore-amr< / sup > < br > < sup > opus< / sup > < br > < sup > shine< / sup > < br > < sup > snappy< / sup > < br > < sup > soxr< / sup > < br > < sup > speex< / sup > < br > < sup > twolame< / sup > < br > < sup > vo-amrwbenc< / sup > < br > < sup > dav1d< / sup > < / td >
< td align = "center" > < sup > fontconfig< / sup > < br > < sup > freetype< / sup > < br > < sup > fribidi< / sup > < br > < sup > gmp< / sup > < br > < sup > gnutls< / sup > < br > < sup > kvazaar< / sup > < br > < sup > lame< / sup > < br > < sup > libaom< / sup > < br > < sup > libass< / sup > < br > < sup > libiconv< / sup > < br > < sup > libilbc< / sup > < br > < sup > libtheora< / sup > < br > < sup > libvorbis< / sup > < br > < sup > libvpx< / sup > < br > < sup > libwebp< / sup > < br > < sup > libxml2< / sup > < br > < sup > opencore-amr< / sup > < br > < sup > opus< / sup > < br > < sup > shine< / sup > < br > < sup > snappy< / sup > < br > < sup > soxr< / sup > < br > < sup > speex< / sup > < br > < sup > twolame< / sup > < br > < sup > vid.stab< / sup > < br > < sup > vo-amrwbenc< / sup > < br > < sup > dav1d< / sup > < br > < sup > x264< / sup > < br > < sup > x265< / sup > < br > < sup > xvidcore< / sup > < / td >
2020-08-05 03:53:02 +03:00
< / tr >
< tr >
< td align = "center" > < sup > android system libraries< / sup > < / td >
< td align = "center" colspan = 8 > < sup > zlib< / sup > < br > < sup > MediaCodec< / sup > < / td >
< / tr >
< tr >
< td align = "center" > < sup > ios system libraries< / sup > < / td >
< td align = "center" colspan = 8 > < sup > zlib< / sup > < br > < sup > AudioToolbox< / sup > < br > < sup > AVFoundation< / sup > < br > < sup > iconv< / sup > < br > < sup > VideoToolbox< / sup > < br > < sup > bzip2< / sup > < / td >
< / tr >
< tr >
< td align = "center" > < sup > tvos system libraries< / sup > < / td >
< td align = "center" colspan = 8 > < sup > zlib< / sup > < br > < sup > AudioToolbox< / sup > < br > < sup > iconv< / sup > < br > < sup > VideoToolbox< / sup > < br > < sup > bzip2< / sup > < / td >
< / tr >
< / tbody >
< / table >
- `AVFoundation` is not available on `tvOS` , `VideoToolbox` is not available on `tvOS` LTS releases
#### 2.2 Android
1. Add FFmpegKit dependency to your `build.gradle` in `ffmpeg-kit-<package name>` pattern.
```
dependencies {
implementation 'com.arthenica:ffmpeg-kit-full:4.4'
}
```
2. Execute synchronous FFmpeg commands.
```
import com.arthenica.ffmpegkit.Config;
import com.arthenica.ffmpegkit.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.ffmpegkit.Config;
import com.arthenica.ffmpegkit.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) {
2020-11-23 00:51:45 +02:00
if (returnCode == RETURN_CODE_SUCCESS) {
2020-08-05 03:53:02 +03:00
Log.i(Config.TAG, "Async command execution completed successfully.");
2020-11-23 00:51:45 +02:00
} else if (returnCode == RETURN_CODE_CANCEL) {
2020-08-05 03:53:02 +03:00
Log.i(Config.TAG, "Async command execution cancelled by user.");
} else {
2020-11-23 00:51:45 +02:00
Log.i(Config.TAG, String.format("Async command execution failed with returnCode=%d.", returnCode));
2020-08-05 03:53:02 +03:00
}
}
});
```
4. Execute FFprobe commands.
```
import com.arthenica.ffmpegkit.Config;
import com.arthenica.ffmpegkit.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 FFmpegKit dependency to your `Podfile` in `ffmpeg-kit-<package name>` pattern.
- iOS
```
pod 'ffmpeg-kit-full', '~> 4.4'
```
- tvOS
```
pod 'ffmpeg-kit-tvos-full', '~> 4.4'
```
2. Execute synchronous FFmpeg commands.
```
#import < ffmpegkit / FFmpegKitConfig . h >
#import < ffmpegkit / FFmpegKit . h >
int rc = [FFmpegKit 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, [FFmpegKitConfig getLastCommandOutput]);
}
```
3. Execute asynchronous FFmpeg commands.
```
#import < ffmpegkit / FFmpegKitConfig . h >
#import < ffmpegkit / FFmpegKit . h >
long executionId = [FFmpegKit 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 < ffmpegkit / FFmpegKitConfig . h >
#import < ffmpegkit / FFprobeKit . h >
int rc = [FFprobeKit 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, [FFmpegKitConfig getLastCommandOutput]);
}
```
5. Check execution output later.
```
int rc = [FFmpegKitConfig getLastReturnCode];
NSString *output = [FFmpegKitConfig 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
```
[FFmpegKit cancel];
```
- Stop a specific execution
```
[FFmpegKit cancel:executionId];
```
7. Get media information for a file.
```
MediaInformation *mediaInformation = [FFprobeKit 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` .
```
[FFmpegKit 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.
```
[FFmpegKitConfig setLogDelegate:self];
- (void)logCallback:(long)executionId :(int)level :(NSString*)message {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", message);
});
}
```
10. Enable statistics callback.
```
[FFmpegKitConfig 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.
```
[FFmpegKitConfig ignoreSignal:SIGXCPU];
```
12. List ongoing executions.
```
NSArray* ffmpegExecutions = [FFmpegKit 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.
```
[FFmpegKitConfig setLogLevel:AV_LOG_FATAL];
```
14. Register custom fonts directory.
```
[FFmpegKitConfig setFontDirectory:@"< folder with fonts > " with:nil];
```
#### 2.4 Manual Installation
##### 2.4.1 Android
You can import `FFmpegKit` 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 ](https://github.com/tanersener/ffmpeg-kit/wiki/Importing-Frameworks ) guide.
If you want to use universal binaries please refer to [Using Universal Binaries ](https://github.com/tanersener/ffmpeg-kit/wiki/Using-Universal-Binaries ) guide.
#### 2.5 Test Application
You can see how FFmpegKit 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.
< img src = "https://github.com/tanersener/ffmpeg-kit/blob/master/docs/assets/android_test_app.gif" width = "240" >
### 3. Versions
- `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` .
| FFmpegKit Version | FFmpeg Version | Release Date |
| :----: | :----: |:----: |
| [4.4 ](https://github.com/tanersener/ffmpeg-kit/releases/tag/v4.4 ) | 4.4-dev-416 | Jul 25, 2020 |
| [4.4.LTS ](https://github.com/tanersener/ffmpeg-kit/releases/tag/v4.4.LTS ) | 4.4-dev-416 | Jul 24, 2020 |
### 4. LTS Releases
`FFmpegKit` binaries are published in two release 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< br / > arm64-v8a< br / > x86< br / > x86-64 | arm-v7a< br / > arm-v7a-neon< br / > arm64-v8a< br / > x86< br / > x86-64 |
| Xcode Support | 10.1 | 7.3.1 |
| iOS SDK | 12.1 | 9.3 |
| iOS AVFoundation | Yes | - |
| iOS Architectures | arm64< br / > x86-64< br / > x86-64-mac-catalyst | armv7< br / > arm64< br / > i386< br / > x86-64 |
| tvOS SDK | 10.2 | 9.2 |
| tvOS Architectures | arm64< br / > x86-64 | arm64< br / > x86-64 |
### 5. Building
Build scripts from `master` and `development` branches are tested periodically. See the latest status from the table below.
| branch | status |
| :---: | :---: |
| master | [![Build Status ](https://travis-ci.org/tanersener/ffmpeg-kit.svg?branch=master )](https://travis-ci.org/tanersener/ffmpeg-kit) |
| development | [![Build Status ](https://travis-ci.org/tanersener/ffmpeg-kit.svg?branch=development )](https://travis-ci.org/tanersener/ffmpeg-kit) |
#### 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 ](https://github.com/tanersener/ffmpeg-kit/wiki/Android-Prerequisites ),
[iOS Prerequisites ](https://github.com/tanersener/ffmpeg-kit/wiki/iOS-Prerequisites ) and
[tvOS Prerequisites ](https://github.com/tanersener/ffmpeg-kit/wiki/tvOS-Prerequisites ) for the details.
2. 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
3. iOS builds need these extra packages and tools.
- **Xcode 7.3.1** or later
- **iOS SDK 9.3** or later
- **Command Line Tools**
4. 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 FFmpegKit 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 ](https://github.com/tanersener/ffmpeg-kit/wiki/android.sh ),
[ios.sh ](https://github.com/tanersener/ffmpeg-kit/wiki/ios.sh ) and
[tvos.sh ](https://github.com/tanersener/ffmpeg-kit/wiki/tvos.sh ) to see all available build options.
##### 5.2.1 Android
```
export ANDROID_SDK_ROOT=< Android SDK Path >
export ANDROID_NDK_ROOT=< Android NDK Path >
./android.sh
```
< img src = "https://github.com/tanersener/ffmpeg-kit/blob/master/docs/assets/android_custom.gif" width = "600" >
##### 5.2.2 iOS
```
./ios.sh
```
< img src = "https://github.com/tanersener/ffmpeg-kit/blob/master/docs/assets/ios_custom.gif" width = "600" >
##### 5.2.3 tvOS
```
./tvos.sh
```
< img src = "https://github.com/tanersener/ffmpeg-kit/blob/master/docs/assets/tvos_custom.gif" width = "600" >
##### 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` , `vid.stab` , `x265` and`rubberband` 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 platform.
CPU optimizations (`ASM`) are enabled for most of the external libraries. Details and exceptions can be found under the
[ASM Support ](https://github.com/tanersener/ffmpeg-kit/wiki/ASM-Support ) wiki page.
### 6. Documentation
A more detailed documentation is available at [Wiki ](https://github.com/tanersener/ffmpeg-kit/wiki ).
### 8. License
`FFmpegKit` 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 FFmpegKit 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 `ffmpeg-kit` with `openh264` and distribute that library, then
you are subject to pay `MPEG LA` licensing fees. Refer to [OpenH264 FAQ ](https://www.openh264.org/faq.html ) page for
the details. Please note that `ffmpeg-kit` 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 ](https://www.apache.org/licenses/LICENSE-2.0 ).
In test applications; embedded fonts are licensed under the
[SIL Open Font License ](https://opensource.org/licenses/OFL-1.1 ), other digital assets are published in the public
domain.
Please visit [License ](https://github.com/tanersener/ffmpeg-kit/wiki/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 ](https://ffmpeg.org/legal.html ).
`openh264` clearly states that it uses patented algorithms. Therefore, if you build ffmpeg-kit with openh264 and
distribute that library, then you are subject to pay MPEG LA licensing fees. Refer to
[OpenH264 FAQ ](https://www.openh264.org/faq.html ) page for the details.
### 10. Contributing
Feel free to submit issues or pull requests.
Please note that `master` 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
- [libav gas-preprocessor ](https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl )
- [FFmpeg API Documentation ](https://ffmpeg.org/doxygen/4.0/index.html )
- [FFmpeg Wiki ](https://trac.ffmpeg.org/wiki/WikiStart )
- [FFmpeg External Library Licenses ](https://www.ffmpeg.org/doxygen/4.0/md_LICENSE.html )