Ich habe eine einfache Aufgabe zu tun. Ich muss Bilder in ein Video zusammenführen, indem ich ffmpeg benutze, das in der Android-Umgebung arbeitet.Ausführen ffmpeg als Bibliothek in Android
Nach über einer Woche kämpfen mit verschiedenen Tutorials und Beispielen zu erklären, wie man kompilieren ffmpeg habe ich, sagen wir, mittleren Erfolg. Ich habe endlich ffmpeg für Android zusammengestellt.
Ich folgte diesem Beispiel: https://github.com/appunite/AndroidFFmpeg was am besten für mich funktionierte.
Als Ergebnis des Aufbaus einer folgende Verzeichnisstruktur haben ffmpeg:
[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
Ich folgte auch die NDK Beispiele so habe ich C-Code von Java ausgeführt wird:
#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 !");
}
Meine Frage ist, wie man Funktion von ffmpeg aus meiner "hallo-jni" c-Datei ausführen. Ich habe gelesen, dass ich einen Wrapper über ffmpeg schreiben muss, der mein hallo-jni sein soll.
Hier ist meine Android.mk, die wahrscheinlich ist Teil zu importieren, um mein Ziel zu erreichen, aber ehrlich gesagt verstehe ich einige Zeilen nicht in dieser Datei. Oder ich weiß einfach nicht, wie ich die Dinge zum Laufen bringen kann.
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)
Eine weitere Sache. Ich habe ein Beispiel gefunden, wie man die Hauptfunktion von ffmpeg umschließt. Es wäre der einfachste Weg, ffmpeg für mich zu verwenden sinse ich FFmpegs api weiß nicht, und ich hoffe, dass es möglich ist, ffmpeg auf diese Weise auszuführen: Can FFmpeg be used as a library, instead of a standalone program?
Um es zusammenzufassen, ich denke, dass meine Probleme sind auf völlig fehlt von C/C++ Wissen überhaupt, vor allem, wie man irgendeine Funktion von .so Bibliothek benutzt.
Ich hoffe jemand kann mir helfen :).
Sie könnten die in [JavaCV] (http://code.google.com/p/javacv/) gebündelten Binärdateien ausprobieren. Es gibt auch Anweisungen, wie sie erstellt werden. –