2013-02-25 14 views
7

Ho un compito semplice da fare. Ho bisogno di unire una serie di immagini in un video usando ffmpeg che funziona in ambiente Android.Esecuzione di ffmpeg come libreria in Android

Dopo oltre una settimana di lotta con diversi tutorial ed esempi che spiegano come eseguire compilare ffmpeg ho, diciamo, un successo intermedio. Ho finalmente compilato ffmpeg per Android.

Ho seguito questo esempio: https://github.com/appunite/AndroidFFmpeg che ha funzionato meglio per me.

Come risultato della costruzione di ffmpeg un avere seguente struttura di directory:

[Project]/jni/ffmpeg-build/armeabi-v7a/libffmpeg.so 
[Project]/jni/ffmpeg-build/armeabi/libffmpeg.so 
[Project]/jni/ffmpeg-build/mips/libffmpeg.so 
[Project]/jni/ffmpeg-build/x86/libffmpeg.so 

Ho anche seguito gli esempi NDK così ho esecuzione di codice C da Java:

#include <string.h> 
#include <jni.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <assert.h>  
#include <android/log.h>  
#include <stdlib.h> 
#include <stdbool.h> 

bool initted = false;  
static JavaVM *sVm; 

jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz) { 

    char **argv; 
    char *cmd; 
    int argc; 

// cmd = "ffmpeg -version"; 
// argv = parsedargs(cmd, &argc); 
// ffmpeg(argc, argv); 

    return (*env)->NewStringUTF(env, "Hello from JNI !"); 

} 

La mia domanda è come eseguire la funzione da ffmpeg dal mio c-file "ciao-jni". Ho letto che ho bisogno di scrivere un wrapper su ffmpeg che dovrebbe essere il mio ciao-jni.

Ecco il mio Android.mk che probabilmente è importat parte per raggiungere il mio obiettivo, ma onestamente non capisco alcune linee impostate in questo file. O semplicemente non so come far funzionare le cose.

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_MODULE := ffmpeg-prebuilt 
LOCAL_SRC_FILES := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so 
LOCAL_EXPORT_C_INCLUDES := ffmpeg-build/$(TARGET_ARCH_ABI)/include 
LOCAL_EXPORT_LDLIBS := ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so 
LOCAL_PRELINK_MODULE := true 
include $(PREBUILT_SHARED_LIBRARY) 


include $(CLEAR_VARS) 
LOCAL_ALLOW_UNDEFINED_SYMBOLS=true 
LOCAL_MODULE := hello-jni 
LOCAL_SRC_FILES := hello-jni.c 
LOCAL_C_INCLUDES := $(LOCAL_PATH)/ffmpeg-build/$(TARGET_ARCH_ABI)/include 
LOCAL_SHARED_LIBRARY := ffmpeg-prebuilt 
#LOCAL_CFLAGS += -g -Iffmpeg-prebuilt -Ihello-jni -Wno-deprecated-declarations 
#LOCAL_LDLIBS += -llog -lz -landroid ffmpeg-build/$(TARGET_ARCH_ABI)/libffmpeg.so 

include $(BUILD_SHARED_LIBRARY) 

Un'altra cosa. Ho trovato un esempio su come avvolgere la funzione principale di ffmpeg. Sarebbe il modo più semplice da usare ffmpeg per me sinse non so API di ffmpeg e spero che sia possibile eseguire ffmpeg in questo modo: Can FFmpeg be used as a library, instead of a standalone program?

In sintesi, penso che i miei problemi sono dovuti alla mancanza completamente di conoscenza c/C++, specialmente come usare eseguire qualsiasi funzione dalla libreria .so.

Spero che qualcuno possa aiutarmi :).

+0

È possibile provare i file binari in dotazione in [JavaCV] (http://code.google.com/p/javacv/). Ci sono anche le istruzioni su come costruirle. –

risposta

5

https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/uk_co_halfninja_videokit_Videokit.c

sguardo al 'JNI_Call ...' nel link qui sopra. Ecco come chiamare il wrapper per "ffmpeg.main()" da Android.

https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/ffmpeg.c

uso link qui sopra e trovare 'main()' proprio alla fine. Questo è un esempio di versione leggermente modificata di ffmpeg.c (logger modificato per java/android ndk).

Se si studiano questi esempi, si dovrebbe avere la sensazione di come wrapper ffmpeg.main() in uno degli altri progetti se si desidera utilizzarlo. A questo punto, il problema del logger è discutibile, quindi i più moderni progetti [android-ffmpeg] su git possono solo rendere ffmpeg.c out of the box e usarlo con JNI. L'unica cosa che puoi ancora cambiare è la 'exit()' alla fine di main().

+0

Ciao Robert, sto cercando di compilare la versione LGPL di ffmpeg per Android e sto seguendo questo post. Tuttavia, non capisco perché hai menzionato che devo ancora cambiare è l'exit() alla fine di main(). Nel progetto halfninja hanno ancora il exit_program (0) laggiù, giusto? Perché è necessario apportare la modifica e cosa dovrei cambiare in ?? – scooby

+0

la versione halfninja del sottomodulo ffmpeg è 'd0A2 ...' stai usando quel commit ... NO. quindi il commento non si applica a te e al tuo ffmpeg. –

+0

Attualmente sto provando a usare ffmpeg per la compressione video. Ma dal momento che hai detto che ho bisogno di cambiare l'uscita alla fine di main(), questa è la ragione per cui mi sto chiedendo perché devo farlo? Quali potrebbero essere le conseguenze se uso ffmpeg.c's main() così com'è. ?? – scooby

Problemi correlati