# ExoPlayer FFmpeg extension # ## Description ## The FFmpeg extension is a [Renderer][] implementation that uses FFmpeg to decode audio. [Renderer]: https://google.github.io/ExoPlayer/doc/reference/com/google/android/exoplayer2/Renderer.html ## Build instructions ## To use this extension you need to clone the ExoPlayer repository and depend on its modules locally. Instructions for doing this can be found in ExoPlayer's [top level README][]. In addition, it's necessary to build the extension's native components as follows: * Set the following environment variables: ``` cd "" EXOPLAYER_ROOT="$(pwd)" FFMPEG_EXT_PATH="${EXOPLAYER_ROOT}/extensions/ffmpeg/src/main" ``` * Download the [Android NDK][] and set its location in an environment variable: ``` NDK_PATH="" ``` * Set up host platform ("darwin-x86_64" for Mac OS X): ``` HOST_PLATFORM="linux-x86_64" ``` * Fetch and build FFmpeg. For example, to fetch and build for armeabi-v7a, arm64-v8a and x86 on Linux x86_64: ``` COMMON_OPTIONS="\ --target-os=android \ --disable-static \ --enable-shared \ --disable-doc \ --disable-programs \ --disable-everything \ --disable-avdevice \ --disable-avformat \ --disable-swscale \ --disable-postproc \ --disable-avfilter \ --disable-symver \ --disable-swresample \ --enable-avresample \ --enable-decoder=vorbis \ --enable-decoder=opus \ --enable-decoder=flac \ " && \ cd "${FFMPEG_EXT_PATH}/jni" && \ git clone git://source.ffmpeg.org/ffmpeg ffmpeg && cd ffmpeg && \ ./configure \ --libdir=android-libs/armeabi-v7a \ --arch=arm \ --cpu=armv7-a \ --cross-prefix="${NDK_PATH}/toolchains/arm-linux-androideabi-4.9/prebuilt/${HOST_PLATFORM}/bin/arm-linux-androideabi-" \ --sysroot="${NDK_PATH}/platforms/android-9/arch-arm/" \ --extra-cflags="-march=armv7-a -mfloat-abi=softfp" \ --extra-ldflags="-Wl,--fix-cortex-a8" \ --extra-ldexeflags=-pie \ ${COMMON_OPTIONS} \ && \ make -j4 && make install-libs && \ make clean && ./configure \ --libdir=android-libs/arm64-v8a \ --arch=aarch64 \ --cpu=armv8-a \ --cross-prefix="${NDK_PATH}/toolchains/aarch64-linux-android-4.9/prebuilt/${HOST_PLATFORM}/bin/aarch64-linux-android-" \ --sysroot="${NDK_PATH}/platforms/android-21/arch-arm64/" \ --extra-ldexeflags=-pie \ ${COMMON_OPTIONS} \ && \ make -j4 && make install-libs && \ make clean && ./configure \ --libdir=android-libs/x86 \ --arch=x86 \ --cpu=i686 \ --cross-prefix="${NDK_PATH}/toolchains/x86-4.9/prebuilt/${HOST_PLATFORM}/bin/i686-linux-android-" \ --sysroot="${NDK_PATH}/platforms/android-9/arch-x86/" \ --extra-ldexeflags=-pie \ --disable-asm \ ${COMMON_OPTIONS} \ && \ make -j4 && make install-libs && \ make clean ``` * Build the JNI native libraries, setting `APP_ABI` to include the architectures built in the previous step. For example: ``` cd "${FFMPEG_EXT_PATH}"/jni && \ ${NDK_PATH}/ndk-build APP_ABI="armeabi-v7a arm64-v8a x86" -j4 ``` [top level README]: https://github.com/google/ExoPlayer/blob/release-v2/README.md [Android NDK]: https://developer.android.com/tools/sdk/ndk/index.html