README.md update

pull/25/head
Javernaut 5 years ago
parent 11b1ea5055
commit 4511989ea4
  1. 34
      README.md
  2. BIN
      images/output_structure.png

@ -4,13 +4,15 @@
[![Android Weekly #378](https://androidweekly.net/issues/issue-378/badge)](https://androidweekly.net/issues/issue-378) [![Android Weekly #378](https://androidweekly.net/issues/issue-378/badge)](https://androidweekly.net/issues/issue-378)
[![Android Weekly #396](https://androidweekly.net/issues/issue-396/badge)](https://androidweekly.net/issues/issue-396) [![Android Weekly #396](https://androidweekly.net/issues/issue-396/badge)](https://androidweekly.net/issues/issue-396)
Here is a script that downloads the source code of [FFmpeg](https://www.ffmpeg.org) library and assembles it for Android. The script produces shared libraries as well as header files. The output structure looks like this: <img src="https://github.com/Javernaut/ffmpeg-android-maker/blob/master/images/output_structure.png" width="280" align="right">
<img src="https://github.com/Javernaut/ffmpeg-android-maker/blob/master/images/output_structure.png" width="200"> Here is a script that downloads the source code of [FFmpeg](https://www.ffmpeg.org) library and assembles it for Android. The script produces shared libraries (\*.so files) as well as header files (\*.h files). The output structure is represented in the image.
The actual content of all this directories depends on how the FFmpeg was configured before assembling. For my purpose I enabled only *libavcodec*, *libavformat*, *libavutil* and *libswscale*, but you can set your own configuration to make the FFmpeg you need. The script also produces `ffmpeg` and `ffprobe` executables that can be used in Android's terminal directly or can even be embedded into an Android app. They can be found in `build` directory after the successful build.
The version of FFmpeg here by default is **4.2.2** (but can be overridden). And the script expects to use **at least** Android NDK **r19** (both *r20* and *r21* also work ok). The main focus of ffmpeg-android-maker is to prepare shared libraries for seamless integration into an Android project. And it's not the only thing this project does.
By default this script downloads and build the FFmpeg **4.2.2**, but the version can be overridden.
The details of how this script is implemented are described in this series of posts: The details of how this script is implemented are described in this series of posts:
* [Part 1](https://proandroiddev.com/a-story-about-ffmpeg-in-android-part-i-compilation-898e4a249422) * [Part 1](https://proandroiddev.com/a-story-about-ffmpeg-in-android-part-i-compilation-898e4a249422)
@ -19,7 +21,11 @@ The details of how this script is implemented are described in this series of po
The [WIKI](https://github.com/Javernaut/ffmpeg-android-maker/wiki) contains a lot of useful information. The [WIKI](https://github.com/Javernaut/ffmpeg-android-maker/wiki) contains a lot of useful information.
Actual Android app that uses the output of the script can be found [here](https://github.com/Javernaut/WhatTheCodec). ## Customization
The actual content of `output` directory depends on how the FFmpeg was configured before assembling. The [master](https://github.com/Javernaut/ffmpeg-android-maker) branch of ffmpeg-android-maker builds 'vanilla' version of FFmpeg. This means all default components and libraries are built (according to the image).
The [what-the-codec](https://github.com/Javernaut/ffmpeg-android-maker/tree/what-the-codec) branch contains certain customizations in build scripts of FFmpeg and certain external libraries. These customizations are meant to be an example of how this project can be tuned to obtain the only functionality that is actually needed. The [WhatTheCodec](https://github.com/Javernaut/WhatTheCodec) Android app uses only a subset of FFmpeg's functionality, so the redundant parts are not even compiled. This gives much smaller output binaries.
## Supported Android ABIs ## Supported Android ABIs
@ -30,21 +36,25 @@ Actual Android app that uses the output of the script can be found [here](https:
## Supported host OS ## Supported host OS
On **macOS** or **Linux** just execute the script in terminal. On **macOS** or **Linux** just execute the ffmpeg-android-maker.sh script in terminal. Please follow the instructions in [Requirements](#Requirements) section.
~~It is also possible to execute this script on a **Windows** machine with [MSYS2](https://www.msys2.org). You also need to install specific packages to it: *make*, *git*, *diffutils* and *tar*. The script supports both 32-bit and 64-bit versions of Windows. Also see Prerequisites section for necessary software.~~ ~~It is also possible to execute this script on a **Windows** machine with [MSYS2](https://www.msys2.org). You also need to install specific packages to it: *make*, *git*, *diffutils* and *tar*. The script supports both 32-bit and 64-bit versions of Windows. Also see Prerequisites section for necessary software.~~
Since v2.0.0 the **Windows** support is temporary absent. Since v2.0.0 the **Windows** support is temporary absent, but soon a Docker image will be available to be used on any host OS.
## Requirements
## Prerequisites The script expects to use **at least** Android NDK **r19** (both **r20** and **r21** also work ok).
You have to define two environment variables: Before the script is executed you have to define two environment variables:
* `ANDROID_SDK_HOME` - path to your Android SDK * `ANDROID_SDK_HOME` - path to your Android SDK
* `ANDROID_NDK_HOME` - path to your Android NDK * `ANDROID_NDK_HOME` - path to your Android NDK
Also, if you want to build **libaom**, then you have to install the cmake;3.10.2.4988404 package via Android SDK. Certain external libraries require additional software to be installed:
* **libaom** requires the 'cmake;3.10.2.4988404' package to be installed via Android SDK.
* For **libdav1d** building you also need to install *ninja* and *meson* tools.
For **libdav1d** building you also need to install *ninja* and *meson 0.52.1* tools. Note that if you don't need these external libraries then you also don't need to install the additional software. These external libraries are not built by default.
## Features ## Features
@ -54,4 +64,4 @@ For **libdav1d** building you also need to install *ninja* and *meson 0.52.1* to
**Test your script in a cloud**. This repository has CI integration and you can use it too for your own configurations. See details [here](https://github.com/Javernaut/ffmpeg-android-maker/wiki/Build-automation). **Test your script in a cloud**. This repository has CI integration and you can use it too for your own configurations. See details [here](https://github.com/Javernaut/ffmpeg-android-maker/wiki/Build-automation).
**Text relocations monitoring**. After an assembling is finished you can look into stats/text-relocations.txt file. That file lists all *.so files that were built and reports if any of them have text relocations. If you don't see any mentioning of 'TEXTREL' in the file, you are good. Otherwise, you will see exact binaries that have this problem. **Text relocations monitoring**. After an assembling is finished you can look into stats/text-relocations.txt file. This file lists all \*.so files that were built and reports if any of them has text relocations. If you don't see any mentioning of 'TEXTREL' in the file, you are good. Otherwise, you will see exact binaries that have this problem. The Travis CI build will automatically fail if text relocations occur.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Loading…
Cancel
Save