Compilação de Bibliotecas Multimídia para Android com NDK

Este guia detalha o processo de compilação cruzada de bibliotecas essenciais — libx264, libx265, fdk-aac, zlib e FFmpeg — para arquitetura ARM64 no ambiente Android, utilizando o Android NDK r21e e Ubuntu 22.04.

Configuração do Ambiente

As versões selecionadas priorizam estabilidade sobre novidade: NDK r21e (compatível com API 26–30), x264 (branch master), x265 v3.3 (evitando regressões na integração com FFmpeg), fdk-aac v2.0.3 e zlib 1.3.1. Instale dependências básicas:

sudo apt update && sudo apt install -y \
  git cmake cmake-curses-gui autoconf automake libtool wget unzip

Compilação da libx264 (ARM64)

Configure com suporte a código posicional (--enable-pic) e bibliotecas compartilhadas:

#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/x264/arm64-v8a"

cd x264
./configure \
  --prefix="$OUTPUT_DIR" \
  --host="$TARGET_ARCH" \
  --cross-prefix="$TOOLCHAIN/bin/$TARGET_ARCH-" \
  --sysroot="$TOOLCHAIN/sysroot" \
  --enable-shared \
  --enable-static \
  --enable-pic \
  --disable-cli

make clean && make -j$(nproc) && make install

Compilação da libx265 v3.3 (CMake + Android NDK)

Use CMake com configuração específica para Android. O script abaixo assume uma estrutura de diretórios com source/ e build/android/arm64-v8a/:

#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
export ANDROID_API_VERSION=26
export OUTPUT_PREFIX="/home/ubuntu22/ffpmeg/android/x265"
export NUMBER_OF_CORES=2

cd x265/build/android/arm64-v8a
cmake ../../../source \
  -DCMAKE_SYSTEM_NAME=Android \
  -DCMAKE_SYSTEM_VERSION=$ANDROID_API_VERSION \
  -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \
  -DCMAKE_ANDROID_NDK=$NDK_ROOT \
  -DCMAKE_ANDROID_STL_TYPE=c++_static \
  -DENABLE_CLI=OFF \
  -DENABLE_SHARED=ON \
  -DENABLE_STATIC=ON

# Corrige referência incorreta de pthread
sed -i 's/-lpthread/-pthread/g' CMakeFiles/x265-*.dir/link.txt

make -j$NUMBER_OF_CORES
make DESTDIR="$OUTPUT_PREFIX/arm64-v8a" install

Compilação do zlib (ARM64)

O zlib requer ajustes manuais para arquitetura de 64 bits e flags específicas do NDK:

#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/zlib/arm64-v8a"

cd zlib
CC="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang" \
  ./configure \
    --prefix="$OUTPUT_DIR" \
    --64 \
    --archs="-arch arm64"

make clean && make -j2 && make install

Compilação do fdk-aac v2.0.3

Ative apenas os componentes necessários para codificação em Android, desativando a interface CLI:

#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/aac/arm64-v8a"

cd fdk-aac
./autogen.sh

CC="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang" \
CXX="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang++" \
AS="$TOOLCHAIN/bin/$TARGET_ARCH-as" \
LD="$TOOLCHAIN/bin/$TARGET_ARCH-ld" \
AR="$TOOLCHAIN/bin/$TARGET_ARCH-ar" \
RANLIB="$TOOLCHAIN/bin/$TARGET_ARCH-ranlib" \
STRIP="$TOOLCHAIN/bin/$TARGET_ARCH-strip" \
./configure \
  --host="$TARGET_ARCH" \
  --prefix="$OUTPUT_DIR" \
  --sysroot="$TOOLCHAIN/sysroot" \
  --enable-shared \
  --enable-static \
  --disable-frontend \
  --target=android

make clean && make -j2 && make install

Compilação Final do FFmpeg

O script abaixo integra todas as bibilotecas previamente compiladas. Certifique-se de que PKG_CONFIG_PATH aponte corretamente para os diretórios pkgconfig de cada dependência:

#!/bin/bash
export NDK_ROOT="/home/ubuntu22/ffpmeg/android-ndk-r21e"
TOOLCHAIN="$NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64"
API_LEVEL=26
TARGET_ARCH="aarch64-linux-android"
OUTPUT_DIR="/home/ubuntu22/ffpmeg/android/ffmpeg/arm64-v8a"

# Caminhos das dependências
BASE_PATH="/home/ubuntu22/ffpmeg/android"
ABI="arm64-v8a"
X264_PATH="$BASE_PATH/x264/$ABI"
X265_PATH="$BASE_PATH/x265/$ABI/usr/local"
FDK_PATH="$BASE_PATH/aac/$ABI"
ZLIB_PATH="$BASE_PATH/zlib/$ABI"

export PKG_CONFIG_PATH="$X265_PATH/lib/pkgconfig:$X264_PATH/lib/pkgconfig:$FDK_PATH/lib/pkgconfig:$ZLIB_PATH/lib/pkgconfig"

cd FFmpeg
./configure \
  --prefix="$OUTPUT_DIR" \
  --target-os=android \
  --arch=aarch64 \
  --cpu=armv8-a \
  --cc="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang" \
  --cxx="$TOOLCHAIN/bin/$TARGET_ARCH$API_LEVEL-clang++" \
  --sysroot="$TOOLCHAIN/sysroot" \
  --cross-prefix="$TOOLCHAIN/bin/$TARGET_ARCH-" \
  --enable-cross-compile \
  --enable-shared \
  --enable-static \
  --enable-gpl \
  --enable-nonfree \
  --enable-libx264 \
  --enable-libx265 \
  --enable-libfdk-aac \
  --enable-encoder=libx264,libx265,libfdk_aac \
  --enable-decoders \
  --enable-muxers \
  --enable-demuxers \
  --enable-parsers \
  --enable-protocols \
  --disable-debug \
  --disable-doc \
  --disable-ffplay \
  --disable-ffprobe \
  --disable-postproc \
  --extra-cflags="-I$X264_PATH/include -I$X265_PATH/include -I$FDK_PATH/include -I$ZLIB_PATH/include -Os -fpic" \
  --extra-ldflags="-L$X264_PATH/lib -L$X265_PATH/lib -L$FDK_PATH/lib -L$ZLIB_PATH/lib -lm"

make clean && make -j2 && make install

Pós-compilação

Após a conclusão, verifique se os aretfatos gerados estão presentes em $OUTPUT_DIR/lib/ e $OUTPUT_DIR/include/. Para uso em projetos Android, copie os arquivos .so (renomeando, se necessário, de libx265.so.197 para libx265.so) e os cabeçalhos para os respectivos módulos nativos.

Tags: android-ndk FFmpeg x264 x265 fdk-aac

Publicado em 10-22 07:16