Запуск ffmpeg в качестве библиотеки в android
7 szakal [2013-02-25 14:28:00]
У меня есть простая задача. Мне нужно объединить множество изображений в видео, используя ffmpeg, работающий в среде Android.
После более чем одной недели борьбы с различными учебниками и примерами, объясняющими, как запустить компиляцию ffmpeg, я имею, скажем, средний успех. Я, наконец, скомпилировал ffmpeg для Android.
Я последовал этому примеру: https://github.com/appunite/AndroidFFmpeg который работал лучше всего для меня.
В результате построения ffmpeg a имеет следующую структуру каталогов:
[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
Я также следил за примерами ndk, поэтому у меня есть код 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 !");
}
Мой вопрос - как запустить функцию из ffmpeg из моего c файла hello-jni. Я прочитал, что мне нужно написать обертку над ffmpeg, на которой я бы хотел приветствовать.
Вот мой Android.mk, который, вероятно, является частью importat для достижения моей цели, но, честно говоря, я не понимаю некоторые строки, установленные в этом файле. Или просто я не знаю, как заставить все работать.
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)
Еще одна вещь. Я нашел пример, как обернуть основную функцию ffmpeg. Это был бы самый простой способ использовать ffmpeg для меня sinse. Я не знаю ffmpeg api, и я надеюсь, что можно запустить ffmpeg следующим образом: Может ли FFmpeg использоваться в качестве библиотеки вместо автономной программы?
Подводя итог, я думаю, что мои проблемы связаны с полным отсутствием знаний c/С++ вообще, особенно, как использовать любую функцию из библиотеки .so.
Надеюсь, кто-то может мне помочь:).
c android ffmpeg android-ndk dynamic-linking
1 ответ
5 Robert Rowntree [2013-03-09 04:16:00]
Посмотрите на "JNI_Call..." в ссылке выше. Вот как вызвать оболочку для 'ffmpeg.main()' из android.
https://github.com/halfninja/android-ffmpeg-x264/blob/master/Project/jni/videokit/ffmpeg.c
используйте ссылку выше и найдите "main()" в самом конце. Это пример очень измененной версии ffmpeg.c(logger изменен для java/android ndk).
Если вы изучите эти образцы, вы должны почувствовать, как обернуть ffmpeg.main() в одном из других проектов, если вы хотите его использовать. Проблема регистратор спорно в данный момент, так что более современные [Android-FFmpeg] проекты git можно просто сделать ffmpeg.c из коробки и использовать его с JNI. Единственное, что вам еще нужно изменить, это "exit()" в самом конце main().