This repository contains script(s) to build ffmpeg for android with RTMP (and OpenSSL) support.
- Install the Android NDK (tested with version r10).
- Ensure that cURL is installed.
- Ensure that pkg-config is installed.
- Clone this repository and
cd
into its directory. - Run
build.sh
. - Look in
build/dist
for the resulting libraries and executables. - Look in
build/build.log
if something goes wrong.
For example:
$ git clone git@github.com:cine-io/android-ffmpeg-with-rtmp.git
$ cd android-ffmpeg-with-rtmp
$ ./build.sh
The first time you run the script, it will try to find the location where
you've installed the NDK. It will also try to auto-detect your operating
system and architecture. This process might take a minute or two, so the
information will be saved into a configuration file called
.build-config.sh
which will be used on subsequent executions of
the script.
The script is meant to be idempotent. However, should you want to start over from scratch, it's a simple matter of:
$ rm -rf src build .build-config.sh
$ ./build.sh
To use ffmpeg
with an Android app you will need to deploy the binaries along
with the libraries. Here's a listing of the build/dist
directory.
.
├── bin
│ ├── ffmpeg
│ ├── openssl
│ └── ssltest
└── lib
├── libavcodec-56.so
├── libavdevice-56.so
├── libavfilter-5.so
├── libavformat-56.so
├── libavutil-54.so
├── libcrypto.so
├── librtmp-1.so
├── libssl.so
├── libswresample-1.so
└── libswscale-3.so
A simple way to deploy the binaries would be to archive (e.g. zip) these directories and copy the archive in a res/raw directory within the Android project. Then at runtime, unpack the archive into a directory accessible to the app and set the appropriate permissions, e.g. chmod 750 -R directory-name.
In order for the Android app to use the libraries the LD_LIBRARY_PATH must be set to the location where the libraries reside. For example:
// Change the permissions
Runtime.getRuntime().exec("chmod -R 0750 "+ abspath).waitFor();
//...
ProcessBuilder processBuilder = new ProcessBuilder(cmd);
final Map<String, String> environment = processBuilder.environment();
environment.put("LD_LIBRARY_PATH", context.getDir("lib", 0).getAbsolutePath());
Process process = processBuilder.start();
//...
Inspired by: openssl-android and FFmpeg-Android.