【问题标题】:How can I get FFmpeg to locate installed libraries when --sysroot is pointing to another directory?当 --sysroot 指向另一个目录时,如何让 FFmpeg 找到已安装的库?
【发布时间】:2012-02-25 18:53:42
【问题描述】:

我一直在这样做,从字面上看好几天了。我正在尝试使用 libmp3lame 构建 FFmpeg 以在 Android 应用程序中使用。构建脚本设置了一个 --sysroot 标志,该标志指向 Android NDK 目录,以便以 Android 可以使用的方式构建这些库。

当我将标志添加到--enable-libmp3lame 时,问题就来了;我在构建启动期间收到ERROR: libmp3lame >= 3.98.3 not found。我知道 LAME,它的库已安装,因为我可以手动运行 ./configure --enable-libmp3lame 并且配置启动顺利,并显示 libmp3lame 已为此构建启用。但是,这样的构建根本无法满足我的需要,因为我需要 Android NDK 来完成一些工作。

我已经将问题归结为这个构建脚本正在声明 sysroot 的事实,并且通过一些研究,我尝试将 -Luser/include-L/user/include 添加到额外的 cflags 和 ldflags(我' ve read 是 gcc 的默认搜索位置)。我也尝试了其他几件事,但我相信这里有人可以帮助解决这个特定问题。整个构建脚本如下:

额外信息:

  • 构建操作系统:Ubuntu 11.10
  • FFmpeg 版本:来自 git 的最新版本
  • LAME 版本:3.9.x
  • Android NDK:r7

build.sh

#!/bin/bash

if [ "$NDK" = "" ]; then
    echo NDK variable not set, assuming ${HOME}/android-ndk
    export NDK=${HOME}/android-ndk
fi

SYSROOT=$NDK/platforms/android-3/arch-arm
# Expand the prebuilt/* path into the correct one
TOOLCHAIN=`echo $NDK/toolchains/arm-linux-androideabi-4.4.3/prebuilt/*-x86`
export PATH=$TOOLCHAIN/bin:$PATH

rm -rf build/ffmpeg
mkdir -p build/ffmpeg
cd ffmpeg

# Don't build any neon version for now
for version in armv5te armv7a; do

        DEST=../build/ffmpeg
        FLAGS="--target-os=linux --cross-prefix=arm-linux-androideabi- --arch=arm"
        FLAGS="$FLAGS --sysroot=$SYSROOT"
        FLAGS="$FLAGS --soname-prefix=/data/data/net.smartnotes/lib/"
        FLAGS="$FLAGS --enable-shared --disable-symver"
        FLAGS="$FLAGS --enable-small --optimization-flags=-O2"
        FLAGS="$FLAGS --disable-everything --enable-protocol=file"
        FLAGS="$FLAGS --enable-libmp3lame --enable-encoder=nellymoser"

        case "$version" in
                neon)
                    EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon"
                    EXTRA_LDFLAGS="-Wl,--fix-cortex-a8"
                    # Runtime choosing neon vs non-neon requires
                    # renamed files
                    ABI="armeabi-v7a"
                    ;;
                armv7a)
                    # I have tried many things here.
                    EXTRA_CFLAGS="-march=armv7-a -mfloat-abi=softfp"
                    EXTRA_LDFLAGS=""
                    ABI="armeabi-v7a"
                    ;;
                *)
                    # I have tried many things here.
                    EXTRA_CFLAGS="-Luser/include"
                    EXTRA_LDFLAGS=""
                    ABI="armeabi"
                    ;;
        esac
        DEST="$DEST/$ABI"
        FLAGS="$FLAGS --prefix=$DEST"

        mkdir -p $DEST
        echo $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" > $DEST/info.txt
        ./configure $FLAGS --extra-cflags="$EXTRA_CFLAGS" --extra-ldflags="$EXTRA_LDFLAGS" | tee $DEST/configuration.txt
        [ $PIPESTATUS == 0 ] || exit 1
        make clean
        make -j4 || exit 1
        make install || exit 1

done

【问题讨论】:

    标签: gcc build ffmpeg android-ndk sh


    【解决方案1】:

    我看到您使用的项目位于 http://bambuser.com/opensource

    我遇到了同样的问题并这样解决:

    1. 使用https://github.com/intervigilium/liblame为android编译la脚
    2. 这是来自“bambuser.com”的原始build.sh 和我使用的diff 之间的一个小diff

      3c3,6
      <  export NDK=${HOME}/downloads/android-ndk # r8d
      ---
      > if [ "$NDK" = "" ]; then
      >     echo NDK variable not set, assuming ${HOME}/android-ndk
      >     export NDK=${HOME}/android-ndk
      > fi
      15,16c18
      < #for version in armv5te armv7a; do
      <  for version in         armv7a; do
      ---
      > for version in armv5te armv7a; do
      24c26
      <     FLAGS="$FLAGS --disable-everything --enable-libmp3lame"
      ---
      >     FLAGS="$FLAGS --disable-everything"
      
    3. 从“intervigilium”项目复制文件夹liblame/jni/lamePATH_TO_NDK/platforms/android-3/arch-arm/usr/include

    4. 从“intervigilium”项目复制liblame/libs/armeabi-v7a/liblame.soPATH_TO_NDK/platforms/android-3/arch-arm/usr/libs 并在libmp3lame.so重命名
    5. 终于运行build.sh
    6. 你应该没事的:

      install prefix            ../build/ffmpeg/armeabi-v7a
      source path               /home/samuele/downloads/ffmpeg/ffmpeg-android/ffmpeg
      C compiler                arm-linux-androideabi-gcc
      ARCH                      arm (generic)
      big-endian                no
      runtime cpu detection     no
      ARMv5TE enabled           yes
      ARMv6 enabled             yes
      ARMv6T2 enabled           yes
      ARM VFP enabled           yes
      IWMMXT enabled            no
      NEON enabled              no
      debug symbols             yes
      strip symbols             yes
      optimizations             small
      static                    yes
      shared                    yes
      postprocessing support    no
      new filter support        yes
      network support           yes
      threading support         pthreads
      SDL support               no
      Sun medialib support      no
      AVISynth enabled          no
      frei0r enabled            no
      libdc1394 support         no
      libdirac enabled          no
      libfaac enabled           no
      libgsm enabled            no
      **libmp3lame enabled        yes**
      libnut enabled            no
      libopencore-amrnb support no
      libopencore-amrwb support no
      libopencv support         no
      libopenjpeg enabled       no
      librtmp enabled           no
      libschroedinger enabled   no
      libspeex enabled          no
      libtheora enabled         no
      libvorbis enabled         no
      libvpx enabled            no
      libx264 enabled           no
      libxavs enabled           no
      libxvid enabled           no
      zlib enabled              no
      bzlib enabled             no
      
      Enabled decoders:
      
      Enabled encoders:
      mpeg2video      nellymoser
      
      Enabled hwaccels:
      
      Enabled parsers:
      
      Enabled demuxers:
      
      Enabled muxers:
      
      Enabled protocols:
      
      Enabled filters:
      buffer
      
      Enabled bsfs:
      
      Enabled indevs:
      
      Enabled outdevs:
      
      License: LGPL version 2.1 or later
      Creating config.mak and config.h...
      libavutil/avconfig.h is unchanged
      

    请注意,我仍然需要测试生成的 FFmpeg 构建。 说实话,现在我必须学习如何在我的应用程序中使用它... ;)

    编辑:我尝试删除 --disable-everything,它的构建结果相同,有很多编码器、解码器等,但 build 目录增加到 ~40MB。

    【讨论】:

      【解决方案2】:

      与其更改包含路径,不如尝试将所有由“make install”创建的 libmp3lame 文件复制到脚本将在其中查找它们的相关目录。插入 ECHO 语句以查明 PATH/CFLAGS/LDFLAGS 在您收到错误时的确切位置,然后将文件复制到那里以便找到它们。

      【讨论】:

      • 我真的不知道实际的 libmp3lame 文件安装在哪里。我确实签入了/user/include,里面有一个lame/lame.h文件,我把它放在了[..]android-ndk/platforms/android-3/arch-arm/user/include /lame dir,但这并没有帮助。我一直怀疑头文件本身不足以削减它。我也尝试将一个充满 LAME 头文件和 C 文件的文件夹复制并粘贴到上述目录中。
      • 只复制 1 个文件或 1 个文件夹当然是行不通的。您必须确定您已将所需的所有文件和文件夹复制到正确的位置。如果我没记错的话,“make install”应该打印出它复制的所有文件,这样你就可以重建 LAME,并且在“make install”时记下所有的文件名和文件夹。
      • 谢谢,我通过下载 LAME 源来做到这一点,并将其解压缩到一个目录。当我调用“配置”时,我做了 --prefix=(指定了这些制作的文件应该输出到的目录)。完成 make install,获取 include 和 lib 目录,并将其分别存放在 Android NDK 的 include 和 lib 目录中。我仍然无法让它工作。我放弃了尝试使用 FFmpeg 为我处理 LAME,并回到仅在我的应用程序中使用本地构建的 LAME(我可以开始工作,但音频输出不正确)。[...]
      • [...] 我在这里开始了一个关于 SO 的帖子:stackoverflow.com/questions/9139004/…
      猜你喜欢
      • 2021-09-16
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2016-05-12
      • 2023-03-27
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多