Запуск 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]

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

Посмотрите на "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().