我有一个简单的任务要做。我需要使用在 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 库中的任何函数。
我希望有一个人可以帮助我 :)。