7

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

在与解释如何运行 compile 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: FFmpeg 可以用作库,而不是独立程序吗?

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

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

4

1 回答 1

5

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

Look at the 'JNI_Call...' in the link above. That is how to call the wrapper for 'ffmpeg.main()' from android.

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

use link above and find 'main()' at the very end. This is example of very slightly altered version of ffmpeg.c (logger altered for java/android ndk).

If you study these samples , you should get feeling for how to wrapper ffmpeg.main() in one of the other projects if you want to use it. The logger issue is moot at this point so the more modern [android-ffmpeg] projects on git can just make ffmpeg.c out of the box and use it with JNI. The only thing u may still have to change is the 'exit()' at the very end of main().

于 2013-03-09T01:16:33.730 回答