【问题标题】:FFmpeg for Android platformFFmpeg for Android 平台
【发布时间】:2014-04-29 17:43:34
【问题描述】:

我正在尝试创建一个使用 FFMpeg 的 android 应用程序。为此,我从http://www.ffmpeg.org/olddownload.html 下载了 FFmpeg 代码(v 0.8.15)。并按照http://www.roman10.net/how-to-build-ffmpeg-for-android/的说明编译代码

因此,Android/lib 文件夹中生成了 .a 文件,android/include 文件夹中生成了 .h 文件。

但是,当我尝试创建使用此预构建 FFmpeg 库(.a 文件)的本机代码的 .so 文件时,它会给出未定义的引用错误。

请在下面找到我的项目的代码结构。

项目路径为/home/guest/Neeraj_temp/FFMpeg-Example

在这条路径上,我创建了两个文件夹 jni & prebuilt 在预建文件夹中,我保留了 libavfilter.a、libavcodec.a、libavformat.a、libavutil.a、libswscale.a 在 jni 文件夹中,我保留了一个包含所有 .h 文件夹(libavcodec、libavfilter、libavformat、libavutil、libswscale)的包含文件夹。

api-example.c 文件也保存在使用 FFmpeg 的 API 的 jni 文件夹中。 & 一个 Android.mk 文件在 jni 文件夹中。

Android.mk:-

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := libFFmpeg
LOCAL_C_INCLUDES := $(LOCAL_PATH)/FFMpeg/include
LOCAL_SRC_FILES := api-example.c
LOCAL_LDLIBS += -L$(LOCAL_PATH)/../prebuilt -lavfilter -lavutil -lavformat -lavcodec -lswscale
include $(BUILD_SHARED_LIBRARY) 

错误:

/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wavpack.c:689: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wavpack.o): In function `wv_unpack_stereo':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wavpack.c:604: undefined reference to `av_log'
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wavpack.c:608: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wavpack.o):/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wavpack.c:1215: more undefined references to `av_log' follow
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wmavoice.o): In function `synth_block_fcb_acb':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:1359: undefined reference to `av_memcpy_backptr'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wmavoice.o): In function `synth_frame':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:1441: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wmavoice.o): In function `synth_superframe':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:1765: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wmavoice.o): In function `wmavoice_decode_packet':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:1919: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wmavoice.o): In function `wmavoice_decode_init':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:350: undefined reference to `av_log'
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:373: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wmavoice.o):/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wmavoice.c:397: more undefined references to `av_log' follow
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(wnv1.o): In function `decode_frame':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/wnv1.c:81: undefined reference to `av_reverse'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(ws-snd1.o): In function `ws_snd_decode_frame':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/ws-snd1.c:70: undefined reference to `av_log'
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/ws-snd1.c:83: undefined reference to `av_log'
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/ws-snd1.c:79: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(xan.o): In function `xan_decode_frame':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/xan.c:568: undefined reference to `av_log'
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/xan.c:551: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(xan.o):/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/xan.c:515: more undefined references to `av_log' follow
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(xan.o): In function `xan_unpack':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/xan.c:178: undefined reference to `av_memcpy_backptr'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(xl.o): In function `decode_frame':
/home/guest/Neeraj_temp/ffmpeg-0.8.15/libavcodec/xl.c:60: undefined reference to `av_log'
/home/guest/Neeraj_temp/FFMpeg-Example/jni/../prebuilt/libavcodec.a(xsubdec.o): In function `decode_frame'

我已经阅读了很多博客,但仍然无法获得解决方案。请给我解决方案。我需要如何构建不应该出现这些错误的代码并编译代码。

谢谢。

【问题讨论】:

    标签: android ffmpeg


    【解决方案1】:

    我下载了该版本的 FFmpeg 并在 Ubuntu Linux 上构建了它(但不适用于 Android)。我调查了那些给你带来麻烦的功能。

    您似乎只复制了一些链接错误(这很好,因为其余的可能相似)。错误文本显示缺少 2 个符号:av_logav_reverse。这两个都应该在 libavutil.a 中定义。对 libavutil.a 运行 nm 并搜索 'T av_log''R av_reverse'。那些字符串出现了吗?如果不是,则某些文件没有被构建并归档到 libavutil.a 中。搜索已构建的对象并尝试验证 log.o(对于 av_log)和 math.o(对于 av_reverse)都已构建。如果它们不存在,我们需要找出构建缺少它们的原因。

    如果这些字符串确实 存在于nm 列表中,那么我很困惑。这表明 libavutil.a 没有被链接,即使我在您的 LOCAL_LDLIBS 变量中看到它。链接顺序显示正确(avutil 在 libavcodec 之前)。

    【讨论】:

    • 我用 nm 命令检查并发现 av_log 和 av_reverse 存在于 libavutil.a 中。这些行是:-“00000070 T av_log”和“00000200 R av_reverse”。以及我验证 log.o 和 matematices.o 也已构建。
    猜你喜欢
    • 2013-12-27
    • 2017-04-02
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2017-06-28
    • 2012-08-18
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多