요즘 스마트폰 성능도 좋아지고, 망과의 데이터 속도도 좋아짐에 따라, 멀티미디어 서비스 분야에 더욱더 초점이 맞추어지고 있습니다. 이러한 분위기에 발맞추어 멀티미디어 분야에 대해 스터디 중인데요...
http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1645684
에 스터디 하기 좋은 자료가 있어서 따라해 보았습니다.
아래 웹페이지에서는 테스트시 사용할 수 있는 전체코드를 배포하고 있습니다.
http://www.androidpub.com/index.php?_filter=search&mid=android_dev_info&search_target=title&search_keyword=ffmpeg&document_srl=1648388
준비물 및 빌드 방법은 다음과 같습니다.
1) cygwin
윈도우 환경에서 cross compiler 로 빌드하기 위한 준비단계로, cygwin 을 설치합니다. 아래 버전을 사용하고 있습니다.
$ uname -a
CYGWIN_NT-6.1 wolf-PC 1.7.10(0.259/5/3) 2012-02-05 12:36 i686 Cygwin
2) NDK 설치
http://developer.android.com/sdk/ndk/index.html 에서 다운로드 받을 수 있습니다.
32비트 환경에서 작업하므로, android-ndk-r9c-windows-x86.zip 를 다운로드 하였습니다. 설치디렉토리를 환경설정의 PATH 에 등록해 줍니다.( 예: C:\work\android-ndk-r9c)
3) standalone tool 설치
다운로드 받은 NDK 안에서 아래 명령어를 통해 추출해 낼 수 있습니다. cygwin Terminal 을 관리자 권한으로 실행 후, 아래 명령을 입력합니다.
$ /cygdrive/c/work/android-ndk-r9c/build/tools/make-standalone-toolchain.sh --platform=android-8 --install-dir=/android-toolchain
관리자 권한으로 실행하지 않으면, 아래와 같은 Permission denied 에러 메시지가 출력됩니다.
$ make-standalone-toolchain.sh --platform=android-8 --install-dir=/path/to/target --ndk-dir=/path/to/android-ndk/
Auto-config: --toolchain=arm-linux-androideabi-4.4.3
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying libstdc++ headers and libraries...
mkdir: cannot create directory `/tmp/build-6212/standalone/arm-linux-androideabi-4.4.3/arm-linux-androideabi': Permission denied
ERROR: Cannot copy to directory: /tmp/build-6212/standalone/arm-linux-androideabi-4.4.3/arm-linux-androideabi/include/c++/4.4.3
4) android app project 생성
http://www.androidpub.com/index.php?mid=android_dev_info&page=1&search_target=tag&search_keyword=FFmpeg&document_srl=1645684 를 참고하여 생성합니다. 필자는 E:\212.JavaTraning\FFmpeg 에 생성하였는데, 원하는 위치에 하면됩니다.
프로젝트 디렉토리 안에 jni 디렉토리를 생성합니다. ( E:\212.JavaTraning\FFmpeg\jni 처럼)
5) ffmpeg 소스 및 jni 를 이용하기 위한 소스 추가
http://www.androidpub.com/index.php?_filter=search&mid=android_dev_info&search_target=title&search_keyword=ffmpeg&document_srl=1648388 에서 소스를 다운로드 하여 jni 디렉토리 하위 내용을 전부 해당 위치로 복사해 옵니다. (안드로이드 앱 프로젝트 소스도 포함되어 있으니 참고하면 됩니다.)
변경 사항들에대해서 알고 싶으면 위의 URL 로 가서, 강좌를 쭉~ 보시기 바랍니다.
a. config.sh 에서
export ANDROID_ROOT=/cygdrive/c/my-android-toolchain 를 자신의 환경에 맞게 바꾸어 줍니다.
필자는 export ANDROID_ROOT=/android-toolchain 로 변경함.
b. C:\ffmpegtmp 디렉토리를 생성합니다. configure 명령을 실행하면서 중간에 필요한 파일들의 임시 저장소로 사용됩니다.
6) ffmpeg source 빌드
cygwin terminal 에서 jni/ffmpeg 위치로 이동합니다. ( 필자는 /cygdrive/e/212.JavaTraning/FFmpeg/jni/ffmpeg 위치)
$ . ./config.sh 를 입력하여 정상적으로 configure 가 실행된다면, 해당 디렉토리에 config.h 가 생깁니다.
이 명령이 실행되면서 출력되는 메시지를 보면, no such file or directory 들도 보이고,
WARNING: /android-toolchain/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.
이런 warning 도 보이지만, config.h 가 최종 생성됩니다.
(사실, 전체소스안에 이미 config.h 가 생성되어 있는데, 새로이 생성해 보았습니다.)
그 후, android app project 디렉토리로 이동하여 (/cygdrive/e/212.JavaTraning/FFmpeg)
$ ndk-build 명령을 실행합니다.
실행시 아래와 같은 에러가 발생한다면...
jni/ffmpeg/libavcodec/srtdec.c: In function 'srt_to_ass':
jni/ffmpeg/libavcodec/srtdec.c:113:61: error: format not a string literal and no format arguments [-Werror=format-security]
jni/ffmpeg/libavcodec/srtdec.c:149:53: error: format not a string literal and no format arguments [-Werror=format-security]
cc1.exe: some warnings being treated as errors
/cygdrive/c/work/android-ndk-r9c/build/core/build-binary.mk:386: recipe for target `obj/local/armeabi-v7a/objs/avcodec/srtdec.o' failed
make: *** [obj/local/armeabi-v7a/objs/avcodec/srtdec.o] Error 1
>>>웹서핑을 해보니 이런 내용이 있습니다.
srtdec.c 파일 113 라인의 snprintf 부분에서 오류가 났습니다. NDK 버젼이 바뀌면서 snprintf에 "%s" 같은 포멧 선언이 빠지면 컴파일시 warring만 나오던데서 에러가 나오게 변경되서 컴파일이 안 된 겁니다. 설명대로 CFLAG에 -Werror=format-security 를 추가하셔도 되고, snprintf 사이에 "%s" 같은 것을 넣어주셔도 됩니다.
예) out += snprintf(out, out_end-out, "%s", stack[j].param[i]); 필자는 이런식으로 수정해서 빌드했습니다.
제법 시간이 흐린 뒤, 빌드에 성공하면, {android app project directory}\FFmpeg\libs\armeabi-v7a\ 에 libbasicplayer.so 가 생성됩니다.
7) android app project build
eclipse 에서 해당 프로젝트를 열고, 안드로이드 폰을 usb 케이블로 PC와 연결후, build 버튼을 선택합니다. 필자는 아래 동영상이 플레이됩니다. (윈도우즈 OS에 기본적으로 있는 "야생.wmv" 를 실행시켜 보았습니다. 소리는 나지 않고요... ^^;; audio codec에 대한 디코딩 부분을 확인해 봐야겠죠...)
RECENT COMMENT