안녕하세요 ^^

부족한 실력에 처음으로 강좌를 씁니다.
안펍 뿐만 아니라 다른 국내외 사이트를 보면 FFmpeg를 Android 어플 개발에 사용하시려고 질문하시는 분들이 많이 있습니다.
제가 처음 FFmpeg를 사용해 어플 개발을 시작하면서 무한 삽질했던 뼈아픈(?) 추억이 있기 때문에
이런 분들에게 조금이라도 도움이 되고자 강좌를 써봅니다.

총 4편에 걸쳐 쓰도록 하겠습니다.


1. 시작하는 말

Android NDK가 가장 필요한 시점이 내가 원하는 기능을 구현하기 위해 어떤 오픈 소스 라이브러리를 사용해야 하는 때입니다.
유명한 오픈 소스 라이브러리는 거의 대부분 C 언어로 작성되어 있기 때문에 NDK를 통해서 써야만 합니다.
그런데 Linux 프로그래밍, gcc, make, configure, autotools 등에 매우 능숙하신 분이 아니면
오픈 소스 라이브러리를 Android NDK로 컴파일 하는 과정 자체가 어렵고 힘들어서 포기하는 경우가 많습니다.

그런 분들을 위해서 이 강좌를 쓰게 되었습니다.
다양한 오픈 소스 라이브러리를 자유롭게 써서 Android 어플을 만들 수 있게 되면
작성할 수 있는 어플의 범위나 수준이 상당히 넓어지고 높아진다는 것을 알게 되실 것입니다.

FFmpeg 라이브러리는 각종 미디어 파일의 (소프트웨어) 인코딩, 디코딩시 필수적인 라이브러리 입니다.
이것만 있는 건 아니겠지만 개인 개발자 입장에서는 이것 외에 다른 선택의 여지는 거의 없다고 할 수 있습니다.
유명한 mp3 플레이어인 PowerAMP, 무인코딩 동영상 플레이어인 Vital Player 등이 모두 FFmpeg를 사용해 만든 어플입니다.
(윈도우 쪽으로 가면 곰 플레이어 등 더 수없이 많은 유명한 프로그램들이 FFmpeg로 만들어졌습니다.)

FFmpeg를 쓸 수 있게 되면, 무인코딩 동영상 플레이는 물론이고
영상을 프레임 별로 다 뽑아낼 수 있고, 사운드를 샘플 단위로 다 뽑아내 가공해서 플레이하고, 또 인코딩 할 수 있기 때문에
Android SDK를 이용해서는 만들 수 없었던 아주 다양하고 독창적인 어플들을 개발할 수 있게 됩니다.

물론 "Android NDK FFmpeg"로 구글링 해보시면 정말 많은 자료들을 찾을 수 있습니다.
하나하나 유용한 자료들이지만 막상 따라 해보면 생각만큼 잘 되지는 않습니다.
이 강좌도 완전하지는 않겠지만 FFmpeg 컴파일 과정에서 어려움을 겪는 분들께 도움이 되었으면 합니다 ^^
또 FFmpeg 컴파일을 성공하고 나면 다른 오픈 소스 라이브러리도 쉽게 컴파일 하실 수 있을 겁니다.

참고:
이 강좌는 Neon 모듈을 포함하고 있는 arm CortexA8 이상의 AP 기준으로 컴파일합니다.
대부분의 폰들이 이 조건을 만족하니 별 걱정은 안하셔도 좋습니다.
예외는 MSM7227과 같은 arm11 core를 사용한 Optimus One, Galaxy Neo 등의 저사양 폰
간혹 고사양 폰 중에도 Optimus 2X의 tagra2 같은 경우는 CortexA9 이지만 Neon 옵션이 빠져 있어서 이 강좌대로 하시면 안 돌아갑니다.
Galaxy S 또는 S2, Nexus 시리즈, 그 외 1GHz 이상의 AP를 가진 거의 대부분의 폰에는 Neon이 들어 있습니다.
Neon 옵션을 빼고 컴파일 하는 방법도 있고, 둘 다 동적으로 지원하는 방법도 있지만 이 부분은 나중에 추가 강좌로 올리든가 하겠습니다.

참고:
Neon을 추가하면 일부 코덱에서 상당한 수준의 성능 향상이 있습니다.
제가 테스트 해본 결과 H.264 코덱에서 최소 35 % 이상의 성능 향상이 있습니다.
그러므로 Neon이 있는 폰에서는 Neon으로 실행될 수 있게 해주는 것이 좋습니다.


2. 컴파일 환경 설정

Android NDK 설치 및 기본 설정에 관한 것은 설명하지 않습니다.
http://developer.android.com/sdk/ndk/index.html 또는 다른 관련 글을 참고하시기 바랍니다.

다음은 제가 설치한 폴더 정보입니다.
앞으로 강좌를 진행할 때 제 컴의 경로를 기준으로 설명할 것입니다.
따라하실때는 경로를 자신의 컴퓨터 기준으로 잘 바꿔서 하시기 바랍니다.
(이에 대해서는 다시 설명하지 않겠습니다)

* Cygwin

윈도우에서 cygwin을 설치하여 사용합니다.
cygwin에서 잘 안되니 리눅스에 깔아서도 해보시고 하시는데 cygwin에서도 충분히 잘 됩니다.
Android NDK를 설치하는 과정에서 보통 make만 install 하는 경우가 많은데
앞으로 오픈 소스 라이브러리 컴파일 할 일이 많으시면 미래를 위해 필요한 패키지들은 인스톨 해두는 것이 편합니다.
make 외에도 libtool, automake, autoconf, pkg-config 등의 tool등을 install 합니다.
(FFmpeg 컴파일 때는 없어도 됩니다. ^^ 저런 것도 앞으로 쓸 일이 있을 수 있다는 뜻입니다)

* Android NDK

Android NDK r5b 버전을 사용하였습니다. (현재 최신은 r5c 버전)
c:/android-ndk-r5b 폴더에 설치하였습니다.

* Standalone toolchain

추가로 Standalone toolchain을 설치하여야 합니다.

Standalone toolchain은 Android NDK 최근 버전부터 추가된 기능입니다.
이걸 사용하면 ndk-build 명령을 쓰지 않고
기존의 configure -> make를 사용하던 컴파일 과정을 그대로 사용해서 라이브러리를 컴파일 할 수 있습니다.
문제는 아직 (r5b 까지는) beta라서 기능이 완전하지 않고 신뢰할 만 하지 않습니다.
그래서 이 방법을 써서 FFmpeg를 컴파일 하지는 않고 ndk-build를 사용할 것 입니다.
하지만 config.h 등을 생성하는 과정에서 유용할 때가 있으니 꼭 설치하도록 합니다.

설치 폴더를 c:/my-android-toolchain 로 할 경우 cygwin에서 아래와 같이 한 줄 입력해 주시면 됩니다.

$ /cygdrive/c/android-ndk-r5b/build/tools/make-standalone-toolchain.sh --platform=android-8 --install-dir=/cygdrive/c/my-android-toolchain

윈도우에서 확인해보면 c:/my-android-toolchain 폴더가 생기고 안에 컴파일러와 라이브러리, 헤더 파일 등이 들어있는 것을 알 수 있습니다.

참고:
Standalong toolchain에 관한 추가적인 사항은
c:/android-ndk-r5b/docs/STANDALONE-TOOLCHAIN.html 을 참고하시기 바랍니다.


3. FFmepg 다운로드

http://ffmpeg.org/download.html 에 방문하여 최신 버전을 다운로드 받습니다.
저는 FFmpeg 0.8 을 다운받아서 사용하였습니다.
"Download gzip tarball" 을 클릭하시면 됩니다.

압축을 풀 때는 알집 같은 것을 쓰지 말고 되도록이면 cygwin에서 "tar xvfz" 를 사용해서 압축을 풉니다.
ffmpeg-0.8 폴더에 압축이 풀릴 것 입니다.


4. 프로젝트 생성

eclipse에서 FFmpeg를 테스트 할 Android project를 생성합니다.
다음과 같은 설정으로 만듭니다.

Project name: FFmpegBasic
Build Target: Android 2.2
Application name: FFmpegBasic
Package name: net.jbong.FFmpegBasic
Create Activity: FFmpegBasic
Min SDK Version: 8

제 프로젝트는 아래와 같은 폴더에 생성하였습니다.
g:/Root/FFmpegBasic

참고:
FFmpeg 프로젝트 폴더는 너무 길게 잡지 않는 것이 좋습니다.
예를들어 d:/Project/Programming/Android/FFmpegBasic 이런 식의 폴더는 좋지 않습니다.
되도록이면 d:/FFmpegBasic 과 같이 심플하게 잡습니다.
나중에 컴파일 오류의 원인이 될 수 있습니다.

프로젝트 폴더에 jni 폴더를 만들고 ffmpeg-0.8 폴더를 통채로 복사합니다.
그 다음 ffmpeg 로 폴더 이름을 변경합니다.
저의 경우 g:/Root/FFmpegBasic/jni/ffmpeg 가 되겠네요.


이제 준비가 모두 끝났습니다. ^^
다음 강좌에서 본격적으로 컴파일을 시작해 보겠습니다.