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.
android / ffmpeg dynamic module, JNI simple wrapper
最新推荐文章于 2024-09-14 19:06:02 发布
1 comments:
hello, what does your ffmpeg make file look like?
Thanks!