FFmpeg를 Android 네이티브 라이브러리로 컴파일하는 것은 널리 알려진 주제이다. NEON SIMD 명령어를 활용하여 성능을 최적화하는 구성도 많이 존재한다. 본 문서에서는 실제 환경에서 검증된 빌드 스크립트를 설명하며, 핵심은 Makefile 설정에 있다.
빌드 환경 설정
컴파일을 수행하기 전에 Android NDK 경로 및 플랫폼 버전을 확인해야 한다. 다음은 기본적인 환경 변수 구성 예시이다.
# 구성 스크립트 예시
NDK=/opt/android/android-ndk-r10e
PLATFORM=$NDK/platforms/android-21/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
PREFIX=$(pwd)/build/neon
TARGET_CPU=armv7a
OPTIMIZE="-mfloat-abi=softfp -mfpu=neon -march=armv7-a"
이 설정에서 중요한 부분은 TOOLCHAIN 경로이다. 올바른 경로를 지정하지 않으면 컴파일 과정에서 크로스 컴파일러를 찾지 못하는 오류가 발생한다.
주요 컴파일 옵션
FFmpeg 빌드 시 NEON 지원을 위해 반드시 필요한 파라미터들이 있다. 이를 적절히 설정하지 않으면 SIMD 최적화가 적용되지 않는다.
./configure \
--target-os=linux \
--prefix=$PREFIX \
--enable-cross-compile \
--arch=arm \
--cpu=$TARGET_CPU \
--enable-neon \
--enable-asm \
--cc=$TOOLCHAIN/bin/arm-linux-androideabi-gcc \
--cxx=$TOOLCHAIN/bin/arm-linux-androideabi-g++ \
--nm=$TOOLCHAIN/bin/arm-linux-androideabi-nm \
--sysroot=$PLATFORM \
--extra-cflags="-fPIC -DANDROID $OPTIMIZE" \
--extra-ldflags="-Wl,-rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -nostdlib -lc -lm -ldl -llog" \
--enable-shared \
--disable-static \
--disable-doc \
--disable-programs \
--disable-avfilter \
--disable-avdevice \
--disable-postproc \
--enable-avcodec \
--enable-avformat \
--enable-avutil \
--enable-swscale \
--enable-pthreads \
--enable-zlib \
--disable-debug
핵심 파라미터 설명
NEON 최적화를 활성화하기 위해 가장 중요한 설정값들은 다음과 같다.
- --cpu=armv7-a: ARM 프로세서 아키텍처 지정
- --enable-neon: NEON SIMD 명령어 활성화
- --enable-asm: 인라인 어셈블리 지원
- -mfpu=neon: 컴파일러 플로트 연산 최적화
- -mfloat-abi=softfp: software floating point와 hardware float interoperability
잘못된 설정 사례
인터넷에서 찾을 수 있는某些 설정에는 불필요하게 복잡한 파라미터가 포함되어 있는 경우가 있다.
# 복잡하고 불필요한 설정 예시
--extra-ldflags="-Wl,-T,$TOOLCHAIN/arm-linux-androideabi/lib/ldscripts/armelf_linux_eabi.x \
-Wl,-rpath-link=$NDK/platforms/android-9/arch-arm/usr/lib \
-L$NDK/platforms/android-9/arch-arm/usr/lib -nostdlib \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.6/crtbegin.o \
$TOOLCHAIN/lib/gcc/arm-linux-androideabi/4.6/crtend.o -lc -lm -ldl"
이러한 과도한 설정은 오히려 빌드 실패의 원인이 될 수 있다. NDK 버전이 올라가면서 기본 제공되는 크로스 컴파일러 설정만으로도 충분한 경우가 많다. 특히 recent NDK versions에서는 간단한 설정으로도 정상적으로 컴파일된다.
빌드 실행
설정이 완료되면 스크립트를 실행하여 빌드를 수행한다.
chmod +x config_android.sh
./config_android.sh
make -j$(nproc)
make install
빌드 결과물은 지정한 prefix 디렉토리에 생성되며, libavcodec, libavformat, libavutil 등의 공유 라이브러리가 포함된다.