마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

FFMPEG 시도중입니다. config.sh 실행시 에러...

0 추천
WARNING: /cygdrive/c/my-android-toolchain/bin/arm-linux-androideabi-pkg-config not found, library detection may fail.
 
다음과 같은 에러가 뜨면서 안되네요...
 
성공하면 android 폴더가 생성되는거 맞죠?ㅠㅠ
 
arm-linux-androideabi-pkg-config 이게 없다고하는데 따로 어디서 받아야되는건가요?ㅠㅠ
아직도초보 (3,030 포인트) 님이 2014년 8월 12일 질문

1개의 답변

+1 추천
 
채택된 답변
warning일 뿐 무시해도 될 부분입니다.

config.sh를 실행하면  android 폴더가 생성되지 않습니다.

아마 config.h 파일과 config.mak 파일이 생성될 겁니다.

이 파일을 기준으로 make 해주시면 ffmpeg쪽 라이브러리가 생성될거구요.
사악미소 (65,330 포인트) 님이 2014년 8월 12일 답변
아직도초보님이 2014년 8월 13일 채택됨
우와! 사악미소님이다~
ffmpeg 글보니 많이 도와주셨더라구요 ㅎㅎ

저도 요렇게 막혔는데 좀 도와주세요 ㅠㅠ

$ ndk-build
Android NDK: There is no Android.mk under /cygdrive/c/FFmpegBasic/jni
Android NDK: If this is intentional  please define APP_BUILD_SCRIPT to point
Android NDK: to a valid NDK build script.
/cygdrive/c/android-ndk-r10/build/core/add-application.mk:224: *** Android NDK: Aborting...    .  멈춤.
로그대로입니다.  /cygdrive/c/FFmpegBasic/jni 경로에 Android.mk 파일이 없어 NDK 빌드가 안 된거죠..  /cygdrive/c/FFmpegBasic에서 ndk-build 해보세요.
아하! 하고 해봤는데 마찬가지네요..ㅠㅠ
거의다한거같은데...좀만더 봐주세요...ㅜㅜ
Administrator@MSDN-SPECIAL /cygdrive/c/FFmpegBasic
$ ndk-build
Android NDK: There is no Android.mk under ./jni
Android NDK: If this is intentional  please define APP_BUILD_SCRIPT to point
Android NDK: to a valid NDK build script.
/cygdrive/c/android-ndk-r10/build/core/add-application.mk:224: *** Android NDK: Aborting...    .  멈춤.
마찬가지로 Android.mk가 없다네요.. 소스를 어디서 받으셨는지 모르겠는데.. Android.mk가 없으면, 맞춰 넣어 주셔야 할 겁니다.
단지 config.sh 가 제대로 되었다면 굳이 ndk-build로 빌드하실  필욘 없습니다. config.sh 실행하셨던 폴더에서 make 명령어만 주시시더라도 config파일 생성시 cross compiler로 안드로이드용 gcc를 지정을 하셨을 테니 ndk 로 빌드된 so 파일이 생성 될겁니다.
Android.mk파일이없다해서  /cygdrive/c/FFmpegBasic 안에서 파일넣고 하니까 돌아갔는데...제대로된건지 오류난건지 잘모르겠어요...ㅠㅠ 잘 돌아간거면 어떤 파일이 생기는건가요...?ㅠㅠ
make 파일이 어떻게 되어있냐에 따라 다르겠지만. 일반적으론 libffmpeg.so 같은게 생길겁니다.
파일은 없는거같아요...실패인걸까요...?ㅠㅠ
결과 로그 보여드릴게요 실패인지 확인좀 부탁드려요될까요..?

C:/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/FFmpegBasic/obj/local/armeabi/objs/basicplayer/BasicPlayer.o: in function closeMovie:C:/FFmpegBasic/jni/BasicPlayer.c:136: error: undefined reference to 'av_freep'
C:/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/FFmpegBasic/obj/local/armeabi/objs/basicplayer/BasicPlayer.o: in function closeMovie:C:/FFmpegBasic/jni/BasicPlayer.c:139: error: undefined reference to 'avcodec_close'
C:/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: C:/FFmpegBasic/obj/local/armeabi/objs/basicplayer/BasicPlayer.o: in function closeMovie:C:/FFmpegBasic/jni/BasicPlayer.c:144: error: undefined reference to 'av_close_input_file'
collect2: ld returned 1 exit status
/cygdrive/c/android-ndk-r10/build/core/build-binary.mk:647: recipe for target '/cygdrive/c/FFmpegBasic/obj/local/armeabi/libbasicplayer.so' failed
make: *** [/cygdrive/c/FFmpegBasic/obj/local/armeabi/libbasicplayer.so] Error 1

계속해서 오류가 있네요...실패인듯보입니다...ㅠㅠ
적어주신 로그는 FFMPEG 쪽 라이브러리쪽 심볼을 찾을 수 없다고 나오는 것인데요...

남은그루터기님이 올려주신 소스를 사용해서 빌드하셨나보네요.
그 프로젝트는 잘 빌드되는 소스입니다.
 
프로젝트를  eclipese에서 import 시키신 후 프로젝트에서 마우스 오른쪽 누른 후 나오는 Android tools->ADD Native supprot 를 선택하시고(파일명은 상관없습니다)  이클립스에서 빌드해보세요.
이클립스에서 NDK경로 지정되어 있으면, 빌드를 할 겁니다.

만약 빨간줄이 나온다면,
Properties->C/C++ General->Code Analysis 에서 Use project settings로 바꾸신 후 체크 된 걸 다 빼보세요.
Native Support 를 안써봐서 잘 이해가 안됩니당...ㅠㅠ
클릭하면
Library Name:  lib [  FFmpegBasic  ].so
이렇게 되있는데 finish가 안눌리네요...후아...
제가 NDK경로를 지정안했군요...하하;;
근데 jni-ffmpeg-libavcodev-srtdec.c 에서 빨간줄 나는데 어떡하나요..?
말씀하신거처럼 체크된거 다 풀었는데도 그러네요...흠..
해당 소스를 보면 snprintf 부분이 문제일 텐데요..
출력할 아규먼트 정의가 안되서 발생한 문제입니다.

해결책은 여러개 있는데 편한걸 쓰세요..
1. NDK의 default-build-commands.mk 파일에서,
-Werror=format-security 를 주석한 후 빌드

2. snprintf 에 들어가는 아규먼트 정의
예를 들어 out += snprintf(out, out_end-out,
    stack[j].param[i]);
의 경우
out += snprintf(out, out_end-out, "%s"
    stack[j].param[i]);
와 같이 각각 소스코드를 수정 한 후 빌드

3.자막쪽 소스 문제인지라. 굳이 빌드하지 않아도 된다면,  config.h config.mak 파일에서 CONFIG_SRT_DECODER 를 주석 한 후 빌드
후아...ㅠㅠ감사합니다 댓글 너무 친절하게 달아주세요 ㅠㅠ
다 돌리니까 토스트로 -2 뜨고 다시 finish되던데 맞는거죠?ㅎㅎ
감사합니다 사악미소님! ㅠㅠ
빌드는 맞게 된거구요...  -2는 동작 중 오류난겁니다.
BasicPlayer.c 파일을 살펴보세요.
 av_open_input_file 호출하는 부분이 있는데, 거기서 오류가 나서 -2를 반환하는 것입니다.  
FFmpegBasic.java 파일을 보시면 테스트용 파일 경로가
 "/mnt/sdcard/HSTest/T4_MVI_1498.AVI" 로 되어 있는데, 테스트 하신 단말에는 없으니 오류가 난 것으로  단말에 들어있는 테스트 영상의 경로로 바꿔주시면, 영상이 나올 겁니다.
안녕하세요 사악미소님! 아침부터 질문을 마무리하지못해 죄송할 따름입니다 ㅠㅠ...어제 말씀해주셨던 부분으로 2, 3번 을 가지고 해봤지만 계속 -2가 뜨네요...3번을 해보니 allcodecs.c 쪽 REGISTER_ENCDEC  (SRT, srt);에서도 에러가 나길래 역시 주석해서 돌려봤는데 역시나네요...ㅠ
-2가 나왔다는 건 말씀 드렸듯 파일을 open 못해서 이니. 파일 경로를 잘 고쳐 보세요.. 단말에 따라 sdcard가 /mnt/sdcard/ 쪽이 아닐 수 있습니다.
Environment.getExternalStorageDirectory() 로 sdcard 경로를 확인 해보세요.
sdcard에 test.mp4 파일을 넣었다면 /sdcard/test.mp4로 경로를 넣어 해보셔도 되구요..

3번의 경우 빌드 실패해서 기존 빌드 했던게 돌아가 -2가 나왔을 겁니다.
REGISTER_ENCDEC  (SRT, srt);를 주석해 주셔도 되긴 하는데. 2번을 수행해서 빌드가 되었으면, 굳이 SRT 자막 파서를 막으실필욘 없죠... 3번은 원복해서 다시 빌드 하세요..
험...ㅠㅠ 파일경로 제대로 놓고 해도 -2 뜨네요...
3번도 주석다시 풀고요...
혹시몰라서 File f = new File(fpath);   f.exist(); 로 확인도 되는데 뭐가 문제일까요...?ㅠ
AndroidManifest.xml 에 sdcard 리드 권한(READ_EXTERNAL_STORAGE, READ_INTERNAL_STORAGE)은 넣으신거죠?
넣어도 안 됐다면, 다른 미디어 파일로 해보세요.. ffmpeg에서 지원 못하는 컨텐츠 일수도 있으니요.
크흡!! 드디어 성공입니다! 사악미소님 감사합니다 ㅠㅠㅠㅠ
정말 고생하셨습니다 ㅠㅠ
...