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 :).
È possibile provare i file binari in dotazione in [JavaCV] (http://code.google.com/p/javacv/). Ci sono anche le istruzioni su come costruirle. –