Android Story

[ Android ] FFMpeg 패키지 연동하기

WhiteDuck 2016. 12. 13. 15:35

// 본글은 여러 블로그를 참고하여 작성되었습니다. //

// 작성 일자 : 2016.12.13 //

// FFMPEG과 동영상 플레이어에 관한 기본 지식 : [ http://d2.naver.com/helloworld/8794 ] //



|| 개발 환경 ||


1. OS : Ubuntu 16.04 ( VMware workstation 12 ) : https://www.ubuntu.com/download/desktop

2. Android Studio 2.2.3 : https://developer.android.com/studio/index.html?hl=ko

3. RAM 3GB ( VMware에서 돌아가기 위해서 충분한 RAM 이 필요 )

4. Memory : 30GB ( VMware에서 돌아가기 위해서 충분한 메모리가 필요 )



// Ubuntu 설치 이후부터 설명하며 한글은 지원하지 않은 채로 진행합니다. //

// USB 인식이 안 될 수 있습니다. VMWare 업데이트를 진행한 후에 팔로우하시기 바랍니다. //

// 저자의 ubuntu id는 user입니다. //





|| Android  studio 설치 ||


 참고 : Android 설치 환경 구축 : https://www.davidlab.net/ko/tech/how-to-setup-android-dev-env-on-ubuntu-part1/


1. JDK 설치 



2. Android 설치

// 저자는 앞으로 다운로드하는 모든 항목은 Downloads에 모두 저장하였습니다. //



3. gmtp 설치 [ cpu가 VT-x 를 지원하지 않을 경우, 또는 실 장비 테스트가 필요한 경우 ]

// 저자의 경우에는 그냥 안되서 실 장비 테스트를 하였습니다. //

참고 : http://askubuntu.com/questions/146529/how-to-connect-mtp-devices-via-usb



4. SDK 설치

 4.1. AS(Android Studio 실행)


 4.2 SDK Manager

 Configure > SDKManager




 4.3 install SDK

 하고 싶은 SDK 선택



4.4 install SDK tool

 NDK 설치









|| FFmpeg 빌드 ||


 참고 : http://dev2.prompt.co.kr/77


1. FFMpeg 다운로드 :  https://ffmpeg.org/download.html#releases



2. FFMpeg 파일 이동

 미리 설치했던 NDK 폴더 하위의 sourses 폴더에 집어넣습니다.



3. Configure 파일 수정

 configure 파일은 ffmpeg-3.2.2 파일 안에 있습니다. 이 파일을 변경하지 않으면 빌드 후 so 파일이 만들어질때 *.so.57 과 같은 형식으로 만들어서 AS에 적용되지 않습니다.



4. build script 작성

 ffmpeg-3.2.2 하위에  build_android.sh 생성




5. build










|| JNI 환경 구축 ||


 참고 : http://dev2.prompt.co.kr/78


1. 프로젝트 생성

 일반적인 프로젝트 생성후 Project로 보기



2. 오른쪽 클릭 tool 생성 [ 편의성을 위해서 사용합니다. ]

 File > Setting 클릭 ( 키 중첩으로 Ctrl + Alt + S 가 먹히지 않습니다. )



 2.1. 추가












|| FFMpeg Setting ||


 참고 : http://dev2.prompt.co.kr/79 http://dev2.prompt.co.kr/80


1. ffmpeg Android.mk 세팅 [ ffmpeg에서 so 파일을 가져오기 위한 설정 ]


 $NDK/sources/ffmpeg-3.2.2/android/arm/Android.mk 를 다음 내용으로 만듭니다.

 실제 파일이 정말로 있는지 확인한 후에 진행합니다.


2. build.gradle 수정

 src 하위의 build.gradle을 수정합니다.





3. jni의 Android.mk, Application.mk 작성

src의 main에 jni을 생성하고 Android.mk와 Application.mk를 작성합니다.




보면 알겠지만 ffmpeg라이브러리 이름을 맞춰줘야 한다.

LOCAL_MODULE은 호출되는 ModuleName이며 나중에 loadLibrary와 쌍을 이룬다.


build.gradle에 다음과 같이 써야 적용된다.






|| JNI 컴파일 및 간단한 예제 ||


예제는 http://dev2.prompt.co.kr/80 와 같이 비디오 파일을 복사하는 것이며

ffmpeg 명령은


ffmpeg -i input.mp4 -filter:v crop=300:400:10:20 output.mp4


이라도 한다.


저자는 Download 폴더 밑 demo.mp4 파일을 output.mp4 파일로 복사하였다.


1. AndroidManifest.xml 변경

 외부 입력 장치 접근 권한 허가


2. MainActivity.java 변경

  ndk는 NDKAdapter를 나중에 추가할 것이며, 메소드는 run_ffmepg이다.

  WRITE_EXTERNAL_STORAGE가 있어야 최신 AndroidVersion에서 외부 저장장치 접근이 가능하다.


3. NDKAdapter.java 생성

  간접적으로 ffmpeg 라이브러리에 접근하기 위한 클래스이다.



4. ffmpeg 라이브러리 가져오기 

 jni파일에 ffmpeg에 있던 *.h 밑 .c 파일을 가져온다. ( 파일 통채로 복사해도 됨 )



5. javah NDKAdapter 

 이것을 통해서 jni에 직접적으로 ffmpeg에 접근할 것을 만들어준다.

 참고로 Build > Make Project를 하지 않으면 안 만들어 진다. 



6. com_gluesys_util_NDKAdapter.h 확인

 해당 폴더에는 (5) 번에서 진행되어 컴파일된 .h파일이 있다. 안에는 사용되는 클래스와 메소드가 나오는데 이에 따라 직접적으로 연결시킬 메소드의 이름을 알수 있다. 


7. ffmpeg.c 수정

 jni 파일에 보면 ffmpeg..c 파일이 있다. 거기에는 main()이 있는데 이를 run_ffmpeg으로 수정한다.



7.1 상단에는 include와 define을 정의하고


7.2최 하단에는 (6)에서 만들어진 메소드에 다음과 같은 소스를 기입한다. [ 실제로 테스트의 모바일 저장장치에는 /Download 밑에 demo.mp4가 있어야 한다. ]



8. 다 작성되었으면 ndk-build를 실행한다.




9. 실행 (run) 하면 메인 화면이 크다면 300x400 만큼 짤린 비디오가 생성되어 있을 것이다.


/Dowdloads

  └ demo.mp4

  └ output.mp4




 그 외 참고 자료 : 

 * Android Studio에서 JNI 연동 #1 [ http://blog.naver.com/PostView.nhn?blogId=just4u78&logNo=220630233740&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView ]









|| 2016.12.21 일자 추가 사항 ||


 .ffmpeg 명령을 java에서 동작할 수 있도록 수정


1. MainActivity.java





2. NDKActivity.java



3. ffmpeg.c





4. 실행 (run) 하면 메인 화면이 크다면 300x400 만큼 짤린 비디오가 생성되어 있을 것이다.


/Dowdloads

  └ demo.mp4

  └ output.mp4



반응형