Skip to content

Commit

Permalink
add platform specific documentation
Browse files Browse the repository at this point in the history
  • Loading branch information
tanersener committed Mar 3, 2021
1 parent 0f64d49 commit 9a2792a
Show file tree
Hide file tree
Showing 3 changed files with 423 additions and 3 deletions.
19 changes: 16 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# FFmpegKit ![GitHub release](https://img.shields.io/badge/release-v4.4-blue.svg) ![Maven Central](https://img.shields.io/maven-central/v/com.arthenica/ffmpeg-kit-min) ![CocoaPods](https://img.shields.io/cocoapods/v/ffmpeg-kit-min) [![Build Status](https://travis-ci.org/tanersener/ffmpeg-kit.svg?branch=master)](https://travis-ci.org/tanersener/ffmpeg-kit)
# FFmpegKit ![GitHub release](https://img.shields.io/badge/release-v4.4-blue.svg) ![Maven Central](https://img.shields.io/maven-central/v/com.arthenica/ffmpeg-kit-min) ![CocoaPods](https://img.shields.io/cocoapods/v/ffmpeg-kit-ios-min) [![Build Status](https://travis-ci.org/tanersener/ffmpeg-kit.svg?branch=master)](https://travis-ci.org/tanersener/ffmpeg-kit)

FFmpeg Kit for applications.

Expand All @@ -24,13 +24,22 @@ FFmpeg Kit for applications.

- Licensed under `LGPL 3.0`, or `GPL v3.0` if GPL licensed libraries are enabled

#### 1.1 Android

See [Android](https://github.com/tanersener/ffmpeg-kit/tree/development/android).

#### 1.2 iOS, macOS, tvOS

See [Apple](https://github.com/tanersener/ffmpeg-kit/tree/development/apple).

### 2. Build Scripts
Use `android.sh`, `ios.sh`, `macos.sh` and `tvos.sh` to build `FFmpegKit` for each platform.

All four scripts support additional options to enable external libraries or disable platform architectures.

Refer to `Android` page for `Android` devices and `Apple` page for `iOS`, `macOS`, `tvOS` devices to see the
prerequisites for each platform.
Refer to [Android](https://github.com/tanersener/ffmpeg-kit/tree/development/android) page for `Android` devices and
[Apple](https://github.com/tanersener/ffmpeg-kit/tree/development/apple) page for `iOS`, `macOS`, `tvOS` devices to see
the prerequisites for each platform.

### 3. FFmpegKit Library

Expand All @@ -40,6 +49,10 @@ provides additional features on top of `FFmpeg` to enable platform specific reso
`Android` library has a `Java` API and `Apple` libraries (`iOS`, `macOS`, `tvOS`) have an `Objective-C` API,
which are identical.

See [Android](https://github.com/tanersener/ffmpeg-kit/tree/development/android) page to learn how the `Java` API
can be used on `Android` devices and [Apple](https://github.com/tanersener/ffmpeg-kit/tree/development/apple) page to
learn more about `Objective-C` API for `iOS`, `macOS`, `tvOS` devices.

### 4. Binary Packages

There are eight different `ffmpeg-kit` packages distributed on
Expand Down
184 changes: 184 additions & 0 deletions android/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
# FFmpegKit for Android

### 1. Features
- Supports
- `API Level 16+`
- `arm-v7a`, `arm-v7a-neon`, `arm64-v8a`, `x86` and `x86_64` architectures
- `zlib` and `MediaCodec` system libraries
- Can handle Storage Access Framework (SAF) uris
- Camera access on [supported devices](https://developer.android.com/ndk/guides/stable_apis#camera)
- Builds shared native libraries (.so)
- Creates Android archive with .aar extension

### 2. Building

Run `android.sh` at project root directory to build `ffmpeg-kit` and `ffmpeg` shared libraries.

#### 2.1 Prerequisites

`android.sh` requires the following packages and tools.

1. Install Android tools listed below.
- **Android SDK Build Tools**
- **Android NDK r21e** or later with LLDB and CMake

2. 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 git wget autopoint meson ninja
```

3. Set `ANDROID_SDK_ROOT` and `ANDROID_NDK_ROOT` environment variables.
```
export ANDROID_SDK_ROOT=<Android SDK Path>
export ANDROID_NDK_ROOT=<Android NDK Path>
```

4. `android.sh` needs network connectivity and internet access to `github.com` in order to download the source code
of all libraries except `ffmpeg-kit`.

#### 2.2 Options

Use `--enable-<library name>` flags to support additional external or system libraries and
`--disable-<architecture name>` to disable architectures you don't want to build.

```
./android.sh --enable-fontconfig --disable-arm-v7a-neon
```

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 by `android.sh` can be found under the `prebuilt` directory.

- `Android` archive (.aar file) for `Main` builds is located under the `bundle-android-aar` folder.
- `Android` archive (.aar file) for `LTS` builds is located under the `bundle-android-aar-lts` folder.

### 3. Using

#### 3.1 Android API

1. Declare `mavenCentral` repository and add `FFmpegKit` dependency to your `build.gradle` in
`ffmpeg-kit-<package name>` pattern. Use one of the `FFmpegKit` package names given in the
project [README](https://github.com/tanersener/ffmpeg-kit).

```
repositories {
mavenCentral()
}
dependencies {
implementation 'com.arthenica:ffmpeg-kit-full:4.4.LTS'
}
```

2. Execute synchronous FFmpeg commands.

```
import com.arthenica.ffmpegkit.FFmpegKit;
import com.arthenica.ffmpegkit.ReturnCode;
FFmpegSession session = FFmpegKit.execute("-i file1.mp4 -c:v mpeg4 file2.mp4");
if (ReturnCode.isSuccess(session.getReturnCode())) {
// SUCCESS
} else if (ReturnCode.isCancel(session.getReturnCode())) {
// CANCEL
} else {
// FAILURE
Log.d(TAG, String.format("Command failed with state %s and rc %s.%s", session.getState(), session.getReturnCode(), session.getFailStackTrace()));
}
```

3. Execute asynchronous FFmpeg commands by providing session specific execute/log/session callbacks.

```
FFmpegKit.executeAsync("-i file1.mp4 -c:v mpeg4 file2.mp4", new ExecuteCallback() {
@Override
public void apply(Session session) {
SessionState state = session.getState();
ReturnCode returnCode = session.getReturnCode();
// CALLED WHEN SESSION IS EXECUTED
Log.d(TAG, String.format("FFmpeg process exited with state %s and rc %s.%s", state, returnCode, session.getFailStackTrace()));
}
}, new LogCallback() {
@Override
public void apply(com.arthenica.ffmpegkit.Log log) {
// CALLED WHEN SESSION PRINTS LOGS
}
}, new StatisticsCallback() {
@Override
public void apply(Statistics statistics) {
// CALLED WHEN SESSION GENERATES STATISTICS
}
});
```

4. Execute synchronous FFprobe commands.

```
FFprobeSession session = FFprobeKit.execute(ffprobeCommand);
if (!ReturnCode.isSuccess(session.getReturnCode())) {
Log.d(TAG, "Command failed. Please check output for the details.");
}
```

5. Get session output.

```
Session session = FFmpegKit.execute("-i file1.mp4 -c:v mpeg4 file2.mp4");
Log.d(TAG, session.getOutput());
```

6. Stop ongoing FFmpeg operations.

- Stop all executions
```
FFmpegKit.cancel();
```
- Stop a specific session
```
FFmpegKit.cancel(sessionId);
```

7. Get media information for a file.

```
MediaInformationSession mediaInformation = FFprobeKit.getMediaInformation("<file path or uri>");
mediaInformation.getMediaInformation();
```

8. List previous FFmpeg sessions.

```
List<FFmpegSession> ffmpegSessions = FFmpegKit.listSessions();
for (int i = 0; i < ffmpegSessions.size(); i++) {
FFmpegSession session = ffmpegSessions.get(i);
Log.d(TAG, String.format("Session %d = id:%d, startTime:%s, duration:%s, state:%s, returnCode:%s.",
i,
session.getSessionId(),
session.getStartTime(),
session.getDuration(),
session.getState(),
session.getReturnCode()));
}
```

### 4. Test Application

You can see how `FFmpegKit` is used inside an application by running test applications developed under the
[FFmpegKit Test](https://github.com/tanersener/ffmpeg-kit-test) project.

2 comments on commit 9a2792a

@Robin1654
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given that it supports api level 16+ but in source code, gradle file contains 24 as min sdk

@tanersener
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I assume you mean the build.gradle under the android/ffmpeg-kit-android-lib folder. Yes, that file is configured to build a Main release by default, which supports API Level 24+.

When LTS releases are selected, it is overwritten with the build.lts.gradle file from the tools/release/android folder. That file has minSdkVersion 16.

Please sign in to comment.