在android中运行ffmpeg作为库

时间:2013-02-25 11:28:55

标签: android c android-ndk ffmpeg dynamic-linking

我有一项简单的任务要做。我需要使用在android环境中工作的ffmpeg将一组图片合并到一个视频中。

经过一个多星期的战斗,不同的教程和解释如何运行编译ffmpeg的例子,我说,中间成功。我终于为android编译了ffmpeg。

我按照这个例子: https://github.com/appunite/AndroidFFmpeg 这对我来说效果最好。

由于构建了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

我也遵循了ndk示例,所以我从java运行了c代码:

#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 !");

}

我的问题是如何从我的“hello-jni”c文件中运行ffmpeg中的函数。我已经读过了我需要在ffmpeg上写一个包装器,这是我的hello-jni的目的。

这是我的Android.mk,它可能是实现我的目标的重要部分,但老实说,我不明白这个文件中设置的一些行。或者只是我不知道如何使事情发挥作用。

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最简单的方法我不知道ffmpeg的api我希望以这种方式运行ffmpeg: Can FFmpeg be used as a library, instead of a standalone program?

总而言之,我认为我的问题完全是由于完全缺乏c / c ++知识,特别是如何使用.so库中运行任何函数。

我希望有人可以帮助我:)。

1 个答案:

答案 0 :(得分:5)

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

查看上面链接中的“JNI_Call ...”。这是如何从android调用'ffmpeg.main()'的包装器。

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

使用上面的链接并在最后找到'main()'。这是ffmpeg.c版本略有改动的例子(logger改为java / android ndk)。

如果您研究这些示例,如果要使用它,您应该感觉如何在其他项目中包装ffmpeg.main()。记录器问题在这一点上没有实际意义,因此git上更现代的[android-ffmpeg]项目可以使ffmpeg.c开箱即用并与JNI一起使用。您可能仍需要改变的唯一事情是main()最后的'exit()'。