안녕하세요 ^^

 

마지막 강좌로 실제 컴파일을 완료하고 간단한 플레이어를 만들어 동영상을 돌려보겠습니다.

 

 

8. 간단한 Player 소스 작성 (1)

 

일단은 컴파일 테스트만 해보기 위해서 빈 소스를 작성해 봅니다.

g:/Root/FFmpegBasic/jni/ 폴더 밑에 BasicPlayer 폴더를 만듭니다.
다음과 같은 4개의 파일을 작성합니다.

 

* Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libbasicplayer
LOCAL_SRC_FILES := BasicPlayer.c Interface.c

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../ffmpeg/ \
                    $(LOCAL_PATH)/../ffmpeg/libavcodec \
                    $(LOCAL_PATH)/../ffmpeg/libavformat \
                    $(LOCAL_PATH)/../ffmpeg/libswscale

LOCAL_STATIC_LIBRARIES := libavformat libavcodec libswscale libavutil cpufeatures

LOCAL_LDLIBS := -lz -ljnigraphics

LOCAL_ARM_MODE := arm

include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/cpufeatures)


* Interface.c

#include <jni.h>
#include <android/bitmap.h>
#include "BasicPlayer.h"

void Java_net_jbong_FFmpegBasic_MoviePlayView_initBasicPlayer(JNIEnv *env, jobject thiz)
{
    av_register_all();
}

 

* BasicPlayer.h

#ifndef BASICPLAYER_H__INCED__110326
#define BASICPLAYER_H__INCED__110326

#endif

 

* BasicPlayer.c

#include "avcodec.h"
#include "avformat.h"
#include "swscale.h"
#include "BasicPlayer.h"

 


9. FFmpeg 컴파일

 

cygwin에서 g:/Root/FFmpegBasic 폴더로 이동한 후 다음 명령으로 컴파일을 수행합니다.

 

$ ndk-build

 

시간이 제법 걸립니다.
Warning 메시지가 제법 뜨겠지만 컴파일은 Error없이 잘 수행됩니다.

 


10. 간단한 Player 소스 작성 (2)

 

컴파일이 잘 되는 것을 확인 했으니 실제 폰에서 FFmpeg 가 잘 돌아가는지 테스트 해보겠습니다.

 

간단한 동영상 플레이어를 만듭니다.
이 동영상 플레이어는 가장 기본적인 FFmpeg 테스트 소스입니다.
음성은 나오지도 않고, 영상의 sync도 전혀 맞지 않습니다.
화면이 잘릴 수도 있고, 프로그램이 종료 될 때 자원 해제도 완전하지 않을 수 있습니다.
하지만 어찌되었던 영상이 돌아가긴 돌아갑니다. ^^

 

소스 파일은 첨부드리니 다운로드 받아서 적용해 보시기 바랍니다.

 

g:/Root/FFmpegBasic/BasicPlayer 폴더에 다음 4개 소스 파일을 넣습니다.
Android.mk, BasicPlayer.c, BasicPlayer.h, Interface.c

(아까 작성한 빈 소스 파일을 다 덮어쓰시면 됩니다)

 

g:/Root/FFmpegBasic/src/net/jbong/FFmpegBasic 폴더의 FFmpegBasic.java 파일도 첨부파일로 덮어씁니다.

 

FFmpegBasic.java 파일을 열어 아래와 같은 부분을 찾습니다.

 String fname = "/mnt/sdcard/HSTest/T4_MVI_1498.AVI";

 

제 폰에 들어있는 동영상 파일의 경로명이 적혀 있습니다.

sdcard에 적당한 동영상 파일을 하나 넣어두고 해당 파일의 경로명으로 수정합니다.

 

이제 스마트폰을 연결한 후 실행해 봅니다.
동영상이 나오면 성공입니다 ^-^

 


11. FFmpeg 공부

 

이제 컴파일을 성공했지만 기본적인 플레이어를 만드는 것도 아직 많은 과정이 남아 있습니다.

 

다음 강좌가 도움이 될 것입니다.
http://dranger.com/ffmpeg/
총 8편의 강좌를 여러번 읽어서 완전히 이해하신 후 이 내용을 Android에 맞게 수정하시면 잘 돌아갑니다.

 

위의 강좌가 아주 좋긴 하지만, FFmpeg 최신 버전에 맞지 않는 부분도 많이 있고,

배포할 수 있을 정도의 플레이어를 만들기에는 기능이 부족합니다.


더 필요한 기능은 ffmpeg 폴더 밑에 ffplay.c 소스 파일을 분석해서 구현합니다.
ffplay.c는 ffmpeg와 같이 배포되는 기본 플레이어기 때문에 가장 최신 모범 답안이라고 할 수 있습니다.
소스가 다소 방대하게 느껴지기는 하지만 반복해서 읽어보면 충분히 정복 가능한 분량입니다.

물론 쉽지는 않습니다. 상당한 시행착오와 삽질이 필요하긴 합니다.

 

소스를 분석하시다가 종종 FFmpeg의 Doxygen 문서를 참고하시는게 좋습니다.
http://ffmpeg.org/doxygen/trunk/annotated.html
http://ffmpeg.org/doxygen/trunk/globals.html


 

12. 라이센스 관련

 

FFmpeg는 LGPL을 따릅니다.
자세한 사항은 구글링을 해보시기 바랍니다.

 

요점을 정리하면 다음과 같습니다.
"FFmpeg와 static 하게 link되는 소스는 모두 공개해야 합니다"

 

이 말은 저작권을 어기지 않게 최대한 조심한다고 할 때,
제작하신 어플의 C 코드는 일부 (또는 전부) 공개해야 할 수도 있지만
Java 코드는 전혀 공개하지 않아도 된다는 뜻입니다.

 

즉, "FFmpeg로 어플을 만들면 소스를 공개해야 해서 남들이 내 어플을 허락없이 막 배포하면 어쩌지?" 하는 걱정은 안하셔도 됩니다.
Java 코드 없이는 어플로 쓸 수 없을테니까요...

 


13. 참고 사항 및 끝내는 말

 

제가 강좌 첫 부분에 프로젝트 경로명을 길게 잡지 말라고 말씀드렸습니다.
너무 길게 잡으면 아래와 같은 오류가 뜰 수 있습니다.

 

make: execvp: /cygdrive/c/android-ndk-r5b/ [...중략...]: Argument list too long

 

한마디로 make 하는데 명령이 너무 길어서 처리를 못하겠다는 뜻입니다.
경로가 길어지면 이런 현상이 발생할 수 있으므로

이런 에러가 발생하면 c:/FFmpegBasic 과 같이 매우 간단한 경로로 프로젝트 폴더를 복사해서 다시 컴파일 해보시기 바랍니다.

 

강좌를 정신없이 적었는데 잘 되었는지 모르겠습니다.

관련 어플을 기획하거나 제작하고 계신 분들에게 조금이라도 도움이 되었으면 합니다.

 

긴 강좌 읽어주셔서 감사합니다 ^^