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

FFMPEG로 RTSP 스트리밍

0 추천

안녕하세요 안드로이드펍 가족님들..

현재 재가 아이폰으로는 FFMPEG를 이용해서 RTSP 스트리밍을 성공하였습니다.

그런데 안드로이드는 초보자라서 지식이 부족하긴 한데요..

남은그루터기 님의 강좌 마지막 소스를 NDK로 빌드할때 오류가 발생하였습니다. 그리고 폰에서 테스트하니까 오류가 발생합니다.

제가 멀잘못한걸까요 NDK 다른 소스들은 잘 ndk-bulid -b 하면 잘 빌드 되더라구요.

ndk빌드 시킬때 make: *** [/Users/kkokokkim14/Downloads/FFmpegBasic/obj/local/armeabi-v7a/objs/avcodec/srtdec.o] Error 1

이런 에러가 나오는데 혹시 이거때문인가요...

 

08-21 16:23:36.370: E/AndroidRuntime(2860): FATAL EXCEPTION: main

08-21 16:23:36.370: E/AndroidRuntime(2860): java.lang.ExceptionInInitializerError

08-21 16:23:36.370: E/AndroidRuntime(2860):  at net.jbong.FFmpegBasic.FFmpegBasic.onCreate(FFmpegBasic.java:16)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.Activity.performCreate(Activity.java:5240)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1082)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2037)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2098)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.ActivityThread.access$600(ActivityThread.java:138)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1204)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.os.Handler.dispatchMessage(Handler.java:99)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.os.Looper.loop(Looper.java:137)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at android.app.ActivityThread.main(ActivityThread.java:4886)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at java.lang.reflect.Method.invokeNative(Native Method)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at java.lang.reflect.Method.invoke(Method.java:511)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at dalvik.system.NativeStart.main(Native Method)

08-21 16:23:36.370: E/AndroidRuntime(2860): Caused by: java.lang.UnsatisfiedLinkError: Couldn't load basicplayer: findLibrary returned null

08-21 16:23:36.370: E/AndroidRuntime(2860):  at java.lang.Runtime.loadLibrary(Runtime.java:365)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at java.lang.System.loadLibrary(System.java:535)

08-21 16:23:36.370: E/AndroidRuntime(2860):  at net.jbong.FFmpegBasic.MoviePlayView.<clinit>(FFmpegBasic.java:54)

흠바바 1 (4,000 포인트) 님이 2013년 8월 22일 질문

2개의 답변

0 추천
 
채택된 답변
 NDK를 빌드하는데 실패해서 해당 libbasicplayer.so가 libs/armeabi-v7a 폴더에 생성되지 않아 실행시 so 로드 실패로 첨부한 로그가 나온 듯 합니다.
특히 /Users/kkokokkim14/Downloads/FFmpegBasic/obj/local/armeabi-v7a/objs/avcodec/srtdec.o] Error 1 가 나온다고 하신 것으로 보아서는
C 파일을 컴파일하는데 실패한듯 한데 config 설정이 잘 못 되어서 그럴 가능성이 높습니다.
jni/ffmpeg/config.sh 에서 ANDROID_ROOT 의 경로를 NDK가 설치된 경로로 수정후 
sh 파일을 실행 시키면 config.h, config.mak 파일이 수정한 경로로 변경되니, 변경 시킨 후 다시 빌드해서 테스트 해보세요.
사악미소 (65,330 포인트) 님이 2013년 8월 22일 답변
흠바바 1님이 2013년 8월 22일 채택됨
사악미소님  답변 감사합니다^^
일단 제가 http://blog.naver.com/PostView.nhn?blogId=hello20&logNo=150136506664 이걸 보고 햇습니다 더추가하여야하나요.
말씀해주신 사이트는 일반적인 NDK 사용법만 설명되어있네요. conifg 경로를 안 바꾸셨다면 제가 말씀 드린 부분을 수행해 경로를 변경 해주셔야 ffmpeg 소스가 빌드 됩니다.
아하 알아냈습니다^^ 감사합니다 시도해보겠습니다^^
-cross-prefix=$ANDROID_ROOT/bin/arm-linux-androideabi- \
--cross-prefix=$ANDROID_ROOT/Users/kkokokkim14/Downloads/android-ndk-r9 \
했는데
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: some warnings being treated as errors

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" 같은 것을 넣어주셔도 됩니다.
물론 이 경우 문제가 되는 라인을 다 바꿔야겠지만요..
ex) out += snprintf(out, out_end-out, "%s", stack[j].param[i]);
cflag에  -Werror=format-securit 이걸 추가한다는게 어떻게 하는거죠 추가를 flag파일이라게 없어보이는데
사악미소님 되었습니다 ㅜㅜ 감사합니다
0 추천

빌드시 lib 에 이름을 변경 하신거 아닌가요?

Caused by: java.lang.UnsatisfiedLinkError: Couldn't load basicplayer: findLibrary returned null

aucd29 (218,390 포인트) 님이 2013년 8월 22일 답변
아니요 딱히 건드린건 없스빈다 프로젝트 받고 ndk로 ndk-build -b
하고 인폴트했습니다.
중요한건 ndk로 빌드시 부터 이미 오류가 난다는게
그럼 빌드 오류를 올리셔야 할 것 같네요. 이걸 실행시 오류 로그이니깐요
...