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