2011년 12월 22일 목요일

libffmpeg.so for Android

출처 : http://ryulib.tistory.com/162

만들기는 6-8 개월 전에 만들었는데, 프로젝트에 쫓기면서 살다보니 이제서야 올립니다.  sws_scale() 함수 및 rtsp 등의 프로토콜을 사용하는데 필요한 모든 코드가 포함되어 있습니다.  배속 재생 및 rtsp 버퍼링 등을 지원하는 플레이어를 만들면서 만들었던 것입니다.  FFMPEG의 소스 및 빌드 방법은 http://ryulib.tistory.com/123 를 참고하세요. (http://goo.gl/gTyQ8 에 더 쉽고 자세한 강좌가 있으니 참고하세요)

jni로 한 번 래핑해서 사용하셔야 합니다.
01.jstring
02.Java_ryulib_ffmpeg_FFMpeg_getStreamInformation(JNIEnv* env, jclass clazz, jint handle)
03.{
04.FFmpegHandle *pHandle = (FFmpegHandle *) handle;
05. 
06.char videoInformation[512];
07.avcodec_string(videoInformation, sizeof(videoInformation), pHandle->pVideoCtx, 0);
08. 
09.char audioInformation[512];
10.avcodec_string(audioInformation, sizeof(audioInformation), pHandle->pAudioCtx, 0);
11. 
12.char result[1024 * 4];
13. 
14.sprintf(result,
15."%s\n%s",
16.videoInformation, audioInformation
17.);
18. 
19.return (*env)->NewStringUTF(env, result);
20.}

래핑을 하시게 되면, 자신이 만든 jni로 컴파일한 so 파일과 함께 로딩해서 사용하시면 됩니다.  아래는 제가 libryumpeg.so 라는 이름으로 동적 링크 라이브러리를 만들어서 사용하는 경우의 예 입니다.  
01.package ryulib.ffmpeg;
02. 
03.import android.graphics.Bitmap;
04. 
05.public class FFMpeg {
06. 
07.static {
08.System.loadLibrary("ffmpeg");  
09.System.loadLibrary("ryumpeg"); 
10.}
11. 
12.public static final int Error_General = -1;
13.public static final int Error_Can_Not_Open_File = -2;
14.public static final int Error_Can_Not_Find_StreamInfo = -3;
15.public static final int Error_Can_Not_Find_VidoeStream = -4;
16.public static final int Error_Can_Not_Find_AudioStream = -5;
17.public static final int Error_Can_Not_Open_VideoCodec = -6;
18.public static final int Error_Can_Not_Open_AudioCodec = -7;
19. 
20.public static final int UnknownPacket = 0;
21.public static final int VideoPacket = 1;
22.public static final int AudioPacket = 2;
23. 
24.public static native String getDebugString();      
25. 
26.// openFile(), closeFile(), start(), stop(): Main Thread에서 실행합니다.
27.// start(), stop(): Thread-safe 합니다.
28. 
29.// TODO : 파일이 없을 경우 어플리케이션이 죽음
30.public static native int openFile(String fileName);
31.public static native void closeHandle(int handle);
32. 
33.public static native String getStreamInformation(int handle);  
34. 
35.// openFile() 호출 시, 내부에서 start()를 호출한 상태가 된다.
36.public static native void start(int handle);
37.public static native void stop(int handle);
38. 
39.public static native int readFrameToBuffer(int handle);
40. 
41.public static native byte[] getAudioData(int handle);
42.public static native int getVideoData(int handle, Bitmap bitmap);
43. 
44.public static native int getAudioPacketCount(int handle);
45.public static native int getVideoPacketCount(int handle);
46. 
47.// seekByTime(), rewindByTime(), forwardByTime(), readAudioPacket(): 동일한 쓰레드에서 사용되야 합니다.
48. 
49.public static native boolean seekByTime(int handle, int ms);
50.public static native boolean rewindByTime(int handle, int ms);
51.public static native boolean forwardByTime(int handle, int ms);
52. 
53.public static native int getDuration(int handle);
54.public static native int getPosition(int handle);  
55.public static native int getVideoWidth(int handle);
56.public static native int getVideoHeight(int handle);
57.public static native int getSampleRate(int handle);
58.public static native int getChannels(int handle);
59. 
60.}

 jni에 대해서는 아래 첨부 파일을 참고 하시기 바랍니다.

댓글 없음:

댓글 쓰기