经过一个多星期的战斗,不同的教程和示例解释了如何运行编译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库中运行任何函数.
我希望有一个人可以帮助我 :).
解决方法
查看上面链接中的“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()’.