android ndk ffmpeg 컴파일하기 #1
ffmpeg- 컴파일 환경 셋팅
Cygwin 등을 설치하여 윈도우에서 컴파일 할 수 있지만 가장 확실한 방법은 리눅스에서 컴파일 하는 것입니다.
접속할 수 있는 리눅스 서버가 있다면 좋고, 아니면 VM 을 이용해서 CentOS 7 버전을 설치해 줍니다.
CentOS 라면 7 버전이 편리합니다. (컴파일시 등)
컴파일에 사용할 계정을 하나 만들고 ndk 를 다운 받습니다.
useradd mistyi
su - mistyi
mkdir android
cd android
- ndk 설치
http://developer.android.com/ndk/downloads/index.html
에서 상황에 맞는 ndk 를 다운 받습니다.
혹시 wget 이 없다면 설치해줍니다. root 권한으로
yum -y install wget
wget http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
chmod +x android-ndk-r10e-linux-x86_64.bin
./android-ndk-r10e-linux-x86_64.bin
mv android-ndk-r10e 라는 폴더로 설치가 됩니다.
ndk 폴더를 만들고 이동해주었습니다. 그냥...
mkdir ndk
mv android-ndk-r10e ./ndk/
- ffmpeg 소스 다운로드
ffmpeg 을 아래 주소에서 다운로드 받습니다.
https://ffmpeg.org/download.html
wget http://ffmpeg.org/releases/ffmpeg-2.8.tar.bz2
bz2 압축을 풀 수 없을 경우 root 권한으로
yum install bzip2
tar xvf ffmpeg-2.8.tar.bz2
압축이 풀린 소스를 ndk 의 sources 폴더로 옮겨줍니다.
mv ffmpeg-2.8 ./ndk/android-ndk-r10e/sources/
- 툴채인을 이용한 ffmpeg 의 빌드
cd ./ndk/android-ndk-r10e/sources/ffmpeg-2.8
vi build_android.sh
#!/bin/bash
NDK=/home/mistyi/android/ndk/android-ndk-r10e
SYSROOT=$NDK/platforms/android-9/arch-arm/
TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64
function build_one
{
./configure \
--prefix=$PREFIX \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
--target-os=linux \
--arch=arm \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
$ADDITIONAL_CONFIGURE_FLAG
make clean
make
make install
}
CPU=arm
PREFIX=$(pwd)/android/$CPU
ADDI_CFLAGS="-marm"
build_one
chmod 755 build_android.sh
./build_android.sh
위의 스크립트를 수행하면 없던 android 라는 폴더가 생성됩니다.
cd android/arm
ls -al
drwxrwxr-x. 8 mistyi mistyi 4096 9월 24 02:24 include
drwxrwxr-x. 3 mistyi mistyi 4096 9월 24 02:24 lib
- ndk-build 를 수행하기 위한 준비
vi /home/mistyi/android/ndk/android-ndk-r10e/sources/ffmpeg-2.8/android/arm/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavcodec
LOCAL_SRC_FILES:= lib/libavcodec.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavformat
LOCAL_SRC_FILES:= lib/libavformat.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libswscale
LOCAL_SRC_FILES:= lib/libswscale.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavutil
LOCAL_SRC_FILES:= lib/libavutil.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libavfilter
LOCAL_SRC_FILES:= lib/libavfilter.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE:= libwsresample
LOCAL_SRC_FILES:= lib/libswresample.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
mkdir jni
심플한 예제를 가지고 ffmpeg library 들을 만들어낼 것입니다.
tutorial02.c, kr_co_joytune_androidffmpegtutorial02_MainActivity.h 파일은 첨부한 파일을 참고하시고
jni 폴더에 넣어주세요.
그리고 jni 폴더에 Android.mk, Application.mk 파일을 작성해 줍니다.
vi /home/mistyi/android/ndk/android-ndk-r10e/sources/ffmpeg-2.8/android/arm/jni/Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE := tutorial02
LOCAL_SRC_FILES := tutorial02.c
LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid
LOCAL_SHARED_LIBRARIES := libavformat libavcodec libswscale libavutil libswresample
include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.8/android/arm)
vi /home/mistyi/android/ndk/android-ndk-r10e/sources/ffmpeg-2.8/android/arm/jni/Application.mk
APP_PLATFORM := android-10
(armeabi-v7a 은 neon 관련 명령어셋이 추가됨으로써 연산량이 증가해 멀티미디어 성능이 향상된것이라고 합니다)
- ndk-build
cd /home/mistyi/android/ndk/android-ndk-r10e/sources/ffmpeg-2.8/android/arm
ndk-build
완료 후 폴더를 확인해보면 몇개의 디렉토리가 추가된 것이 보입니다.
-rw-rw-r--. 1 mistyi mistyi 1054 9월 24 03:40 Android.mk
drwxrwxr-x. 8 mistyi mistyi 4096 9월 24 03:27 include
drwxrwxr-x. 2 mistyi mistyi 4096 9월 24 03:38 jni
drwxrwxr-x. 3 mistyi mistyi 4096 9월 24 03:27 lib
drwxrwxr-x. 4 mistyi mistyi 38 9월 24 03:40 libs
drwxrwxr-x. 3 mistyi mistyi 18 9월 24 03:40 obj
[mistyi@localhost libs]$ ll libs/armeabi
합계 13036
-rwxr-xr-x. 1 mistyi mistyi 10764156 9월 24 03:40 libavcodec.so
-rwxr-xr-x. 1 mistyi mistyi 1778304 9월 24 03:40 libavformat.so
-rwxr-xr-x. 1 mistyi mistyi 386468 9월 24 03:40 libavutil.so
-rwxr-xr-x. 1 mistyi mistyi 390548 9월 24 03:40 libswscale.so
-rwxr-xr-x. 1 mistyi mistyi 17712 9월 24 03:40 libtutorial02.so
[mistyi@localhost libs]$ ll libs/armeabi-v7a/
합계 13036
-rwxr-xr-x. 1 mistyi mistyi 10764156 9월 24 03:40 libavcodec.so
-rwxr-xr-x. 1 mistyi mistyi 1778304 9월 24 03:40 libavformat.so
-rwxr-xr-x. 1 mistyi mistyi 386468 9월 24 03:40 libavutil.so
-rwxr-xr-x. 1 mistyi mistyi 390548 9월 24 03:40 libswscale.so
-rwxr-xr-x. 1 mistyi mistyi 17720 9월 24 03:40 libtutorial02.so
저기에 생성된 libs 와 include(헤더파일들이 모여있습니다) 을 필요한 프로젝트에 옮겨 사용하시면 됩니다.
예를들어 안드로이드 스튜디오의 ffmpeg 이 필요한 다른 프로젝트에 so 파일과 include 파일이 위치된 모습을 보여드릴께요.
위와 같이 jni 폴더 아래에 위치해 주시면 되요.
작성중....
'ffmpeg' 카테고리의 다른 글
android ndk ffmpeg 컴파일하기 #1 20161028 수정판 (1) | 2016.10.31 |
---|---|
ffmpeg 사라진 함수들 수정하는 방법 (0) | 2015.09.25 |