System.out.println(...)

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

 

합계 8
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.zip

 

 

그리고 jni 폴더에 Android.mk, Application.mk 파일을 작성해 줍니다.

 

vi /home/mistyi/android/ndk/android-ndk-r10e/sources/ffmpeg-2.8/android/arm/jni/Android.mk

 

LOCAL_PATH := $(call my-dir)

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_ABI := armeabi armeabi-v7a
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

 

완료 후 폴더를 확인해보면 몇개의 디렉토리가 추가된 것이 보입니다.

 

합계 16
-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 폴더 아래에 위치해 주시면 되요.

 

작성중....