2013-02-25 6 views
7

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 :).

+0

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. –

Antwort

5

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

Blick auf die 'JNI_Call ...' in den obigen Link. So rufen Sie den Wrapper für 'ffmpeg.main()' von Android auf.

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

Verwendung Link oben und 'main()' am Ende finden. Dies ist ein Beispiel einer sehr leicht veränderten Version von ffmpeg.c (Logger geändert für Java/Android ndk).

Wenn Sie diese Beispiele studieren, sollten Sie sich darüber im Klaren sein, wie Sie ffmpeg.main() in eines der anderen Projekte einbetten können, wenn Sie es verwenden wollen. Das Problem mit dem Logger ist an dieser Stelle irrelevant, also können die moderneren [android-ffmpeg] Projekte auf git einfach ffmpeg.c aus der Box machen und es mit JNI verwenden. Das einzige, was Sie noch ändern müssen, ist das 'exit()' am Ende von main().

+0

Hallo Robert, ich versuche LGPL Version von ffmpeg für Android zu kompilieren und folge diesem Beitrag. Allerdings verstehe ich nicht, warum Sie erwähnt haben, dass ich noch ändern muss, ist der Ausgang() am Ende von main(). Im Halfinnja-Projekt haben sie dort immer noch das Programm exit_program (0), richtig? Warum ist es erforderlich, die Änderung vorzunehmen und was soll ich ändern? – scooby

+0

Die Halbninja-Version des ffmpeg-Submoduls ist 'd0A2 ...' verwenden Sie dieses Commit ... NEIN. also würde der Kommentar nicht für dich und deine ffmpeg gelten. –

+0

Eigentlich versuche ich ffmpeg für Videokompression. Aber da du erwähnt hast, dass ich den Ausgang am Ende von main() ändern muss, frage ich mich, warum ich das tun muss? Was könnte die Konsequenzen sein, wenn ich das main() von ffmpeg.c verwende, wie es ist. ?? – scooby