How can I get FFmpeg to locate installed libraries

2019-04-09 05:34发布

问题:

I've been going at this, literally for days. I'm trying to build FFmpeg with libmp3lame for use in an Android application. The build script sets a --sysroot flag that points to the Android NDK directory necessary to build these libraries in a way that Android can use them.

The problem comes when I add the flag to --enable-libmp3lame; I get ERROR: libmp3lame >= 3.98.3 not found during the build start up. I know that LAME, and it's libraries are installed, because I can just run ./configure --enable-libmp3lame manually and the configuration launches without a hitch, and shows that libmp3lame is enabled for this build. However, building like this will simply not work for what I need it for, since I need the Android NDK to do some work.

I've tracked the problem down to the fact that this build script is declaring the sysroot, and through some research, I've tried adding -Luser/include, -L/user/includeto the extra cflags, and ldflags (which I've read is the default search location for gcc). I've tried several other things as well, but I'm confident that someone out here can help with this specific problem. This entire build script is as follows:

Extra info:

  • Build OS: Ubuntu 11.10
  • FFmpeg Ver: Latest from git
  • LAME Ver: 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

回答1:

Instead of changing the include paths, why don't you try copying all the libmp3lame files that were created by 'make install' to the relevant directory where the script will look for them. Insert ECHO statements to find out what exactly the PATH/CFLAGS/LDFLAGS are at the point where you get the error, and copy the files there so it does find them.



回答2:

I saw you were using the project located at http://bambuser.com/opensource

I had the same problem and resolved like this:

  1. compile lame for android using https://github.com/intervigilium/liblame
  2. this is a small diff between the original build.sh from "bambuser.com" and the one I used:

    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. from "intervigilium" project copy the folder liblame/jni/lame to PATH_TO_NDK/platforms/android-3/arch-arm/usr/include

  4. from "intervigilium" project copy liblame/libs/armeabi-v7a/liblame.so to PATH_TO_NDK/platforms/android-3/arch-arm/usr/libs and RENAME it in libmp3lame.so.
  5. finally run build.sh.
  6. you should be fine:

    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
    

Be aware, I still need to test the resulting FFmpeg build. To say the truth, now I have to learn how to use it in my App... ;)

EDIT: I tried removing --disable-everything and it builds OK the same, with a lot of encoders, decoders etc, but increasing to ~40MB for the build dir.