android / ffmpeg dynamic module, JNI simple wrapper

android / ffmpeg dynamic module, JNI simple wrapper

On production device, we can't use "executable file ".

we need to build "dynamic, SO module" for ffmpeg/ ffserver.

This post explain how to build SO module and simple JNI interface  for ffmpeg.

1) change ffmpeg.c

a) add JNI part.





// KKS ...

#include

int m_argc = 0;

int M_MAX_ARGC = 30;

char *m_pargv [30];

int dynamic_ffpmeg_main (int argc, char **argv);

jint JNICALL Java_com_ccmedia_codec_ffmpeg_mod_1run ( JNIEnv *, jclass, jstring, jstring );



jint JNICALL Java_com_ccmedia_codec_ffmpeg_mod_1run ( JNIEnv *env, jclass class, jstring pj1, jstring pj2) {

jint ji;

jboolean ic;



char sz_temp [1024];

char seps [] = " ";

char *psztoken, *pszdata;

int i = 0;



const char *pszname;

pszname = (*env)->GetStringUTFChars(env, pj1, &ic);



sprintf ( sz_temp, "ffmpeg %s ", pszname );



if ( ic == JNI_TRUE ) (*env)->ReleaseStringUTFChars(env, pj1, pszname);

// strcpy ( sz_temp, "ffmpeg -i /sdcard/arm_and/bin/tv_dump.mpg http://localhost:8090/feed1.ffm " );



printf ( "[DEBUG] %s/n", sz_temp );



psztoken = strtok ( sz_temp, seps );

while ( psztoken != NULL ) {



m_pargv [ m_argc] = ( char *)malloc ( strlen ( psztoken));

strcpy ( m_pargv [ m_argc], psztoken );

m_argc++;

psztoken = strtok ( NULL, seps);

}



for ( i = 0; i < m_argc; i++ ) {

printf ( "argc[%d] = %s/n", i, m_pargv[i]);

}



dynamic_ffpmeg_main ( m_argc, m_pargv );



ji = 0;



return ji;



}

b) change main function
original  --> int   main (int argc, char **argv )

new  --> int dynamic_ffpmeg_main (int argc, char **argv )

c) add  " new main function "

int main(int argc, char **argv)


{


dynamic_ffpmeg_main ( argc, argv );


return 0;

}

2)  build ffmpeg .


- on preivious post, you can find "configure" option to build ffmpeg.


http://demo860.blogspot.com/2010/06/ffmpeg-libx264-build-for-android.html

3) build ffmpeg SO module using following command.

i use NDK r4 , /export/home/android/ndk/


/export/home/android/ndk/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc /


-nostdlib -Wl,-soname,libffmpeg.so -Wl,-shared,-Bsymbolic /

cmdutils.o ffmpeg.o /

-Wl,--no-whole-archive -Wl,--whole-archive /

/export/home/android/android-ndk-r4/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/libgcc.a /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libc.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libstdc++.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libm.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libz.so /

/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib/libdl.so /

-Wl,--no-undefined -Wl,-z,noexecstack -Wl,-rpath-link=/export/home/android/ndk/build/platforms/android-8/arch-arm/usr/lib /

./libavutil/libavutil.a /

./libavcodec/libavcodec.a /

./libavfilter/libavfilter.a /

./libavformat/libavformat.a /

./libswscale/libswscale.a /

./libavdevice/libavdevice.a /

-o libffmpeg.so


4) now you can use using following ffmpeg wrapper.

public class ffmpeg implements Runnable {




static boolean m_bret = false;


static String m_szconfig = " -i /sdcard/file.mpg -vcodec mpeg4 aaa.mpg";


public native String unimplementedStringFromJNI();

static {



try {



System.out.println ( "[AdDBCache] Module load try ffmpeg : " + System.getProperty("java.library.path"));

// System.load("/sdcard/arm_and/bin/libffmpeg.so");

System.loadLibrary("ffmpeg");

System.out.println ( "[AdDBCache] Module load success");

}

catch ( Exception e ) {

System.out.println ( "[AdDBCache] Module load err : " + System.getProperty("java.library.path"));

}

}



private static synchronized final native int mod_run (String name, String sztoken );



public void set_config ( String sz_config ) {

m_szconfig = sz_config;

}



public void run_core ( String sz_file, String sz_token ) {

int n_stat;

m_bret = false;

n_stat = mod_run ( m_szconfig, sz_token );

m_bret = true;

}



public void run () {

run_core ( "", "");

}

}

5) ffmpeg / ffserver,
 
  - i made both  , dynamic module and run it.
  - the speed is ok but it's use CPU so much.
 
 
1 comments:
Bryan :

hello, what does your ffmpeg make file look like?

Thanks!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值