android / ffmpeg dynamic module, JNI simple wrapper

來源:互聯網
上載者:User

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.
 
  Posted by demo860 at 오후 8:56

1 comments:

Bryan :

hello, what does your ffmpeg make file look like?

Thanks!

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.