FFMPEG + Android包装使用FFMPEG的最新版本

时间:2014-04-04 19:16:45

标签: android android-ndk ffmpeg

我正在尝试编译FFMPEG以使用我的Android应用程序。我看过:https://github.com/halfninja/android-ffmpeg-x264这几乎是我想要的,但我需要更高版本的FFMPEG(所以我正在尝试使用最新版本的2.2)。

我正在使用那里的大多数脚本,但问题是在我运行compile_make_everything.sh之后,我尝试运行ndk-build但是我得到错误(基本上它找不到ffmpeg.c中的main函数) )。

这是我的Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

#LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
LOCAL_MODULE  := videokit
LOCAL_SRC_FILES := videokit/com_myapp_example_FFMpegService.c 

LOCAL_LDLIBS := -llog -ljnigraphics -lz -landroid

LOCAL_STATIC_LIBRARIES :=ffmpeg

include $(BUILD_SHARED_LIBRARY)
$(call import-module,ffmpeg-2.0.1/android/arm)

如果我修改我的LOCAL_SRC_FILES以包含ffmpeg.c,当我试图找到它需要的一些帮助程序库时,它会失败:     LOCAL_SRC_FILES:= videokit / com_myapp_example_FFMpegService.c ffmpeg / ffmpeg.c ffmpeg / cmdutils.c

错误:

  

包含来自的文件   /home/me/ffmpeg/new-android-ffmpeg/Project/jni/ffmpeg/ffmpeg.c:44:0:   /home/me/ffmpeg/new-android-ffmpeg/Project/jni/ffmpeg/libavformat/avformat.h:255:32:   致命错误:libavcodec / avcodec.h:没有这样的文件或目录   编译终止。

如何在能够调用主函数的同时包含最新的ffmpeg库?

2 个答案:

答案 0 :(得分:2)

IMO - 错误的结束是关于没有找到reqd static lib = libavcodec ...

你的“FFMPEG_LIBS”在哪里?你有“libs = ffmpeg”,但根据我的看法,这可能是null / undef ...

很难将ffmpeg升级到./Project/jni中明确标记的提交之外

他说自己在自述文件的底部“更新子模块”......

这个android make设置了由早期版本的ffmpeg构建的JNI构建的本地静态库。

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)

LOCAL_MODULE  := avffmpeg

FFMPEG_LIBS := $(addprefix ffmpeg/, \
 libavfilter/libavfilter.a \
 libavcodec/libavcodec.a \
  libavformat/libavformat.a \
 libswresample/libswresample.a \
 libswscale/libswscale.a \
 libavutil/libavutil.a \
 libpostproc/libpostproc.a )

LOCAL_CFLAGS += -g -Iffmpeg -Ivideokit -Wno-deprecated-declarations 
LOCAL_LDLIBS += -fuse-ld=gold -llog -lz -ldl -landroid $(FFMPEG_LIBS) x264/libx264.a 
LOCAL_SRC_FILES := videokit/com_b2bpo_media_VideoBrowser.c ffmpeg/ffmpeg.c ffmpeg/cmdutils.c

include $(BUILD_SHARED_LIBRARY)

# Use to safely invoke ffmpeg multiple times from the same Activity
include $(CLEAR_VARS)

LOCAL_MODULE := ffmpeginvoke

LOCAL_CFLAGS += -g -Ivideokit -Wno-deprecated-declarations 
LOCAL_LDLIBS += -llog -lz -ldl
LOCAL_SRC_FILES := videokit/ffmpeg_invoke.c
include $(BUILD_SHARED_LIBRARY)

我认为其他人已经成功地获得了ffmpeg 2.0左右,你可能能够了解他们如何设法升级git子模块(x264和ffmpeg)。

我一直在Android上使用旧的ffmpeg并且不会回到有关链接升级后的ffmpeg的问题。太费时间......

答案 1 :(得分:2)

添加LOCAL_C_INCLUDES + = $(LOCAL_PATH)/ ffmpeg可能会有所帮助。

但是,你会遇到更多麻烦。基本上videokit目录中的ffmpeg.c是ffmpeg源代码中原始文件的副本,但它已被修改了一点,不能终止并清理重复使用,以及使用android日志记录功能。当你构建videokit库时,不是在ffmpeg / ffmpeg.c中链接,而是链接修改过的videokit / ffmpeg.c。

您遇到的问题是您已更新ffmpeg目录中的所有来源(以及其下的所有libav *库),但您仍然在尝试链接旧的视频/ffmpeg.c来自0.x对新的2.x来源。你可以想象,它发生了一些变化。

我会建议你在ffmpeg / ffmpeg.c中使用diff videokit / ffmpeg.c,同时检查旧的ffmpeg版本,并查看更改内容。然后,您需要将新的ffmpeg.c复制到videokit目录并执行等效更改。日志记录的东西很简单,清理重复使用而不是终止...这将是一个更多的工作。事情已经发生了很大的变化。

哦,您还需要将新源中的cmdutils.c,ffmpeg_opt.c和ffmpeg_filter.c复制到videokit中,并将其包含在makefile中。他们也可能需要改动。