2013-02-25 11 views
7

Mam proste zadanie do wykonania. Muszę połączyć zestaw zdjęć w wideo przy użyciu ffmpeg działającego w środowisku Android.Uruchamianie ffmpeg jako biblioteki w Androidzie

Po ponad tygodniu walk z różnymi samouczkami i przykładami wyjaśniającymi, jak uruchomić kompilację ffmpeg, mam, powiedzmy, średni sukces. W końcu skompilowałem ffmpeg dla Androida.

Podążyłem za tym przykładem: https://github.com/appunite/AndroidFFmpeg , który działał najlepiej dla mnie.

W wyniku budowy FFmpeg się mieć następującą strukturę katalogów:

[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 

ja również po przykłady NDK więc mam uruchomiony kod C 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 !"); 

} 

Moje pytanie brzmi, jak uruchom funkcję z ffmpeg z mojego pliku "hello-jni" c. Czytałem, że muszę napisać wrapper na ffmpeg, który ma być mój hello-jni.

Oto mój Android.mk, który prawdopodobnie jest częścią importu, aby osiągnąć mój cel, ale szczerze mówiąc nie rozumiem niektórych linii ustawionych w tym pliku. Albo po prostu nie wiem, jak sprawić, żeby wszystko działało.

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) 

Jeszcze jedno. Znalazłem przykład, jak otoczyć główną funkcję ffmpeg. Byłoby najprostszym sposobem użycia ffmpeg dla mnie sinse Nie wiem API FFmpeg i mam nadzieję, że to możliwe, aby uruchomić ffmpeg ten sposób: Can FFmpeg be used as a library, instead of a standalone program?

Podsumowując, myślę, że moje problemy są spowodowane całkowicie brakuje wiedzy w zakresie c/C++, w szczególności jak korzystać z dowolnej funkcji z biblioteki .so.

Mam nadzieję, że ktoś może mi pomóc :).

+0

Możesz wypróbować pliki binarne w pakiecie [JavaCV] (http://code.google.com/p/javacv/). Są też instrukcje, jak je budować. –

Odpowiedz

5

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

Spójrz na 'JNI_Call ...' w linku powyżej. Tak nazywa się opakowanie dla "ffmpeg.main()" z androida.

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

użycie linku powyżej i znajdź 'main()' na samym końcu. Jest to przykład bardzo nieznacznie zmienionej wersji ffmpeg.c (rejestrator zmieniony dla java/android ndk).

Jeśli uczysz się tych próbek, powinieneś poczuć, jak otoczyć ffmpeg.main() w jednym z innych projektów, jeśli chcesz z niego korzystać. Problem z rejestratorem jest w tym momencie dyskusyjny, więc bardziej nowoczesne [android-ffmpeg] projekty na git mogą po prostu zrobić ffmpeg.c po wyjęciu z pudełka i użyć go z JNI. Jedyną rzeczą, którą możesz jeszcze zmienić, jest "exit()" na samym końcu main().

+0

Cześć Robert, próbuję skompilować wersję LGF ffmpeg dla Androida i śledzę ten post. Jednak nie rozumiem, dlaczego wspomniano, że nadal muszę zmienić jest exit() na samym końcu main(). W projekcie halfninja nadal istnieje program exit_program (0), prawda? Dlaczego wymagane jest wprowadzenie zmiany i co powinienem zmienić? – scooby

+0

Wersja półninja modułu ffmpeg to "d0A2 ...", używasz tego zatwierdzenia ... NIE. więc komentarz nie dotyczy Ciebie i Twojego ffmpeg. –

+0

Właściwie próbuję użyć ffmpeg do kompresji wideo. Ale odkąd wspomniałeś, że muszę zmienić wyjście na samym końcu main(), to jest powód dla którego zastanawiam się, dlaczego muszę to zrobić? jakie mogą być konsekwencje, jeśli użyję funkcji main() ffmpeg.c. ?? – scooby

Powiązane problemy