【问题标题】:FFMPEG + Android wrapper using the latest versions off FFMPEGFFMPEG + Android 包装器使用 FFMPEG 的最新版本
【发布时间】:2014-05-17 06:27:03
【问题描述】:

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

我正在使用位于那里的大部分脚本,但问题是在我运行 compile_make_everything.sh 后,我尝试运行 ndk-build 但出现错误(基本上它在 ffmpeg.c 中找不到主要功能)。

这是我的 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 库的同时仍能调用 main 函数?

【问题讨论】:

    标签: android android-ndk ffmpeg


    【解决方案1】:

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

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

    您面临的问题是您已经更新了 ffmpeg 目录中的所有源代码(以及它下面的所有 libav* 库),但您仍在尝试从 0 链接旧的 videokit/ffmpeg.c .x 针对那些新的 2.x 源。可以想象,它发生了一些变化。

    我建议您在检查旧 ffmpeg 版本时将 videokit/ffmpeg.c 与 ffmpeg/ffmpeg.c 进行比较,看看有什么改变。然后您需要将新的 ffmpeg.c 复制到 videokit 目录并执行等效更改。日志记录的东西很简单,清理以供重复使用而不是终止......这将是一个多一点的工作。事情发生了很大的变化。

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

    【讨论】:

    • 看到我复制了新的ffmpeg.c(我愿意稍后处理程序终止等问题),但是由于未定义的变量,它一直无法构建。在这一点上,我不断添加更多文件,直到觉得我必须将整个项目包含在 videokit 文件夹中!我很好奇为什么你会认为那些额外的 3 个文件就是需要复制的全部内容?今天我不在我正在工作的工作站,所以我最多可以在今天晚些时候进行测试。
    • 请记住,它寻找的大部分内容应该通过在库上拥有您已经构建的 ffmpeg 的主要部分(所有 lib*.a 或 lib*.so)来找到用于链接的路径以及用于编译的包含路径上的所有标头。我建议这些的原因是因为这些是我在最近构建它时添加的 - 你当然只需要顶部(ffmpeg)文件夹中的 c 文件,而不是全部。不记得我是否对它们进行了任何更改,但我不这么认为 - 我认为只是 ffmpeg.c。
    【解决方案2】:

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

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

    在 ./Project/jni 中明确标记的提交之外升级 ffmpeg 非常困难

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

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

    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 链接的问题.. 太耗时...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 2014-05-16
      • 1970-01-01
      • 2010-10-24
      • 2019-12-01
      • 1970-01-01
      • 2012-10-09
      • 2011-01-10
      相关资源
      最近更新 更多