2021-03-03 10:11:19 +02:00
# FFmpegKit for iOS, macOS and tvOS
### 1. Features
#### 1.1 iOS
2021-03-04 02:31:47 +02:00
- Supports `iOS SDK 12.1+` on Main releases and `iOS SDK 9.3+` on LTS releases
- Includes `armv7` , `armv7s` , `arm64` , `arm64-simulator` , `arm64e` , `i386` , `x86_64` , `x86_64-mac-catalyst` and
2021-03-03 10:11:19 +02:00
`arm64-mac-catalyst` architectures
- Objective-C API
- Camera access
- `ARC` enabled library
- Built with `-fembed-bitcode` flag
- Creates static `frameworks` , static `xcframeworks` and static `universal (fat)` libraries (.a)
#### 1.2 macOS
2021-03-04 02:31:47 +02:00
- Supports `macOS SDK 10.15+` on Main releases and `macOS SDK 10.11+` on LTS releases
- Includes `arm64` and `x86_64` architectures
2021-03-03 10:11:19 +02:00
- Objective-C API
- Camera access
- `ARC` enabled library
- Built with `-fembed-bitcode` flag
- Creates static `frameworks` , static `xcframeworks` and static `universal (fat)` libraries (.a)
#### 1.3 tvOS
2021-03-04 02:31:47 +02:00
- Supports `tvOS SDK 10.2+` on Main releases and `tvOS SDK 9.2+` on LTS releases
- Includes `arm64` , `arm64-simulator` and `x86_64` architectures
2021-03-03 10:11:19 +02:00
- Objective-C API
- `ARC` enabled library
- Built with `-fembed-bitcode` flag
- Creates static `frameworks` , static `xcframeworks` and static `universal (fat)` libraries (.a)
### 2. Building
2021-03-04 02:31:47 +02:00
Run `ios.sh` /`macos.sh`/`tvos.sh` at project root directory to build `ffmpeg-kit` and `ffmpeg` static libraries for a
2021-03-03 10:11:19 +02:00
platform.
Optionally, use `apple.sh` to combine bundles created by these three scripts in a single bundle.
2021-03-04 02:31:47 +02:00
Please note that `FFmpegKit` project repository includes the source code of `FFmpegKit` only. `ios.sh` , `macos.sh` and
`tvos.sh` need network connectivity and internet access to `github.com` in order to download the source code of
`FFmpeg` and external libraries enabled.
2021-03-03 10:11:19 +02:00
2021-03-04 02:31:47 +02:00
#### 2.1 Prerequisites
2021-03-03 10:11:19 +02:00
2021-03-04 02:31:47 +02:00
`ios.sh` , `macos.sh` and `tvos.sh` require the following tools and packages.
2021-03-03 10:11:19 +02:00
##### 2.1.1 iOS
- **Xcode 7.3.1** or later
- **iOS SDK 9.3** or later
- **Command Line Tools**
##### 2.1.2 macOS
- **Xcode 7.3.1** or later
- **macOS SDK 10.11** or later
- **Command Line Tools**
##### 2.1.3 tvOS
- **Xcode 7.3.1** or later
- **tvOS SDK 9.2** or later
- **Command Line Tools**
2021-03-04 02:31:47 +02:00
##### 2.1.4 Packages
Use your package manager (brew, etc.) to install the following packages.
```
autoconf automake libtool pkg-config curl cmake gcc gperf texinfo yasm nasm bison autogen git wget autopoint meson ninja
```
2021-03-03 10:11:19 +02:00
#### 2.2 Options
2021-03-04 02:31:47 +02:00
Use `--enable-<library name>` flag to support additional external or system libraries and
2021-03-03 10:11:19 +02:00
`--disable-<architecture name>` to disable architectures you don't want to build.
```
./ios.sh --enable-fontconfig --disable-armv7
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
./macos.sh --enable-freetype --enable-macos-avfoundation --disable-arm64
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
./tv.sh --enable-dav1d --enable-libvpx --disable-arm64-simulator
```
Run `--help` to see all available build options.
#### 2.3 LTS Binaries
Use `--lts` option to build lts binaries for each architecture.
#### 2.4 Build Output
All libraries created can be found under the `prebuilt` directory.
- `iOS` `xcframeworks` for `Main` builds are located under the `bundle-apple-xcframework-ios` folder.
- `macOS` `xcframeworks` for `Main` builds are located under the `bundle-apple-xcframework-macos` folder.
- `tvOS` `xcframeworks` for `Main` builds are located under the `bundle-apple-xcframework-tvos` folder.
- `iOS` `frameworks` for `Main` builds are located under the `bundle-apple-framework-ios` folder.
- `iOS` `frameworks` for `LTS` builds are located under the `bundle-apple-framework-ios-lts` folder.
- `iOS` `universal (fat) libraries (.a)` for `LTS` builds are located under the `bundle-apple-universal-ios-lts` folder.
- `macOS` `frameworks` for `Main` builds are located under the `bundle-apple-framework-macos` folder.
- `macOS` `frameworks` for `LTS` builds are located under the `bundle-apple-framework-macos-lts` folder.
- `macOS` `universal (fat) libraries (.a)` for `LTS` builds are located under the `bundle-apple-universal-macos-lts` folder.
- `tvOS` `frameworks` for `Main` builds are located under the `bundle-apple-framework-tvos` folder.
- `tvOS` `frameworks` for `LTS` builds are located under the `bundle-apple-framework-tvos-lts` folder.
- `tvOS` `universal (fat) libraries (.a)` for `LTS` builds are located under the `bundle-apple-universal-tvos-lts` folder.
### 3. Using
#### 3.1 Objective API
2021-03-04 02:31:47 +02:00
1. Add `FFmpegKit` dependency to your `Podfile` in `ffmpeg-kit-<platform>-<package name>` pattern. Use one of the
2021-03-03 10:11:19 +02:00
`FFmpegKit` package names given in the project [README ](https://github.com/tanersener/ffmpeg-kit ).
- iOS
```
2021-09-18 15:20:11 +03:00
pod 'ffmpeg-kit-ios-full', '~> 4.5'
2021-03-03 10:11:19 +02:00
```
- macOS
```
2021-09-18 15:20:11 +03:00
pod 'ffmpeg-kit-macos-full', '~> 4.5'
2021-03-03 10:11:19 +02:00
```
- tvOS
```
2021-09-18 15:20:11 +03:00
pod 'ffmpeg-kit-tvos-full', '~> 4.5'
2021-03-03 10:11:19 +02:00
```
2021-03-04 02:31:47 +02:00
2. Execute synchronous `FFmpeg` commands.
2021-03-03 10:11:19 +02:00
```
#include < ffmpegkit / FFmpegKit . h >
2021-03-04 02:31:47 +02:00
FFmpegSession *session = [FFmpegKit execute:@"-i file1.mp4 -c:v mpeg4 file2.mp4"];
ReturnCode *returnCode = [session getReturnCode];
2021-03-03 10:11:19 +02:00
if ([ReturnCode isSuccess:returnCode]) {
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
// SUCCESS
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
} else if ([ReturnCode isCancel:returnCode]) {
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
// CANCEL
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
} else {
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
// FAILURE
NSLog(@"Command failed with state %@ and rc %@.%@", [FFmpegKitConfig sessionStateToString:[session getState]], returnCode, [session getFailStackTrace]);
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
}
```
2021-03-04 02:31:47 +02:00
3. Each `execute` call (sync or async) creates a new session. Access every detail about your execution from the
session created.
```
FFmpegSession *session = [FFmpegKit execute:@"-i file1.mp4 -c:v mpeg4 file2.mp4"];
// Unique session id created for this execution
long sessionId = [session getSessionId];
// Command arguments as a single string
NSString *command = [session getCommand];
// Command arguments
NSArray *arguments = [session getArguments];
// State of the execution. Shows whether it is still running or completed
SessionState state = [session getState];
// Return code for completed sessions. Will be null if session is still running or ends with a failure
ReturnCode *returnCode = [session getReturnCode];
NSDate *startTime =[session getStartTime];
NSDate *endTime =[session getEndTime];
long duration =[session getDuration];
// Console output generated for this execution
NSString *output = [session getOutput];
// The stack trace if FFmpegKit fails to run a command
NSString *failStackTrace = [session getFailStackTrace];
// The list of logs generated for this execution
NSArray *logs = [session getLogs];
// The list of statistics generated for this execution
NSArray *statistics = [session getStatistics];
```
4. Execute asynchronous `FFmpeg` commands by providing session specific `execute` /`log`/`session` callbacks.
2021-03-03 10:11:19 +02:00
```
id< Session > session = [FFmpegKit executeAsync:@"-i file1.mp4 -c:v mpeg4 file2.mp4" withExecuteCallback:^(id< Session > session){
SessionState state = [session getState];
ReturnCode *returnCode = [session getReturnCode];
// CALLED WHEN SESSION IS EXECUTED
NSLog(@"FFmpeg process exited with state %@ and rc %@.%@", [FFmpegKitConfig sessionStateToString:state], returnCode, [session getFailStackTrace]);
} withLogCallback:^(Log *log) {
// CALLED WHEN SESSION PRINTS LOGS
} withStatisticsCallback:^(Statistics *statistics) {
// CALLED WHEN SESSION GENERATES STATISTICS
}];
```
2021-03-04 02:31:47 +02:00
5. Execute `FFprobe` commands.
- Synchronous
2021-03-03 10:11:19 +02:00
```
FFprobeSession *session = [FFprobeKit execute:ffprobeCommand];
2021-03-04 02:31:47 +02:00
2021-03-03 10:11:19 +02:00
if ([ReturnCode isSuccess:[session getReturnCode]]) {
NSLog(@"Command failed. Please check output for the details.");
}
```
2021-03-04 02:31:47 +02:00
- Asynchronous
```
[FFprobeKit executeAsync:ffmpegCommand withExecuteCallback:^(id< Session > session) {
CALLED WHEN SESSION IS EXECUTED
}];
```
6. Get media information for a file.
2021-03-03 10:11:19 +02:00
```
2021-03-04 02:31:47 +02:00
MediaInformationSession *mediaInformation = [FFprobeKit getMediaInformation:"< file path or uri > "];
MediaInformation *mediaInformation =[mediaInformation getMediaInformation];
2021-03-03 10:11:19 +02:00
```
2021-03-04 02:31:47 +02:00
7. Stop ongoing `FFmpeg` operations.
2021-03-03 10:11:19 +02:00
- Stop all executions
```
[FFmpegKit cancel];
```
- Stop a specific session
```
[FFmpegKit cancel:sessionId];
```
2021-03-04 02:31:47 +02:00
8. Get previous `FFmpeg` and `FFprobe` sessions from session history.
2021-03-03 10:11:19 +02:00
```
2021-03-04 02:31:47 +02:00
NSArray* sessions = [FFmpegKitConfig getSessions];
for (int i = 0; i < [sessions count]; i++) {
id< Session > session = [sessions objectAtIndex:i];
2021-03-03 10:11:19 +02:00
NSLog(@"Session %d = id: %ld, startTime: %@, duration: %ld, state:%@, returnCode:%@.\n",
i,
[session getSessionId],
[session getStartTime],
[session getDuration],
[FFmpegKitConfig sessionStateToString:[session getState]],
[session getReturnCode]);
}
2021-03-04 02:31:47 +02:00
```
9. Enable global callbacks.
- Execute Callback, called when an async execution is ended
```
[FFmpegKitConfig enableExecuteCallback:^(id< Session > session) {
...
}];
```
- Log Callback, called when a session generates logs
```
[FFmpegKitConfig enableLogCallback:^(Log *log) {
...
}];
```
- Statistics Callback, called when a session generates statistics
```
[FFmpegKitConfig enableStatisticsCallback:^(Statistics *statistics) {
...
}];
```
10. Ignore the handling of a signal. Required by `Mono` and frameworks that use `Mono` , e.g. `Unity` and `Xamarin` .
```
[FFmpegKitConfig ignoreSignal:SIGXCPU];
```
11. Register system fonts and custom font directories.
```
2021-04-03 21:17:42 +03:00
[FFmpegKitConfig setFontDirectoryList:[NSArray arrayWithObjects:@"/System/Library/Fonts", @"< folder with fonts > ", nil] with:nil];
2021-03-04 02:31:47 +02:00
```
2021-03-03 10:11:19 +02:00
### 4. Test Application
2021-03-04 02:31:47 +02:00
You can see how `FFmpegKit` is used inside an application by running `iOS` , `macOS` and `tvOS` test applications
developed under the [FFmpegKit Test ](https://github.com/tanersener/ffmpeg-kit-test ) project.