如何为Android编译带有x264和libfdk-aac的FFmpeg

4
大家好。
请谅解我使用错误的英语。
我想使用FFmpeg制作编码应用程序。
我已成功构建了带有FFmpeg的NDK。
然而,编码H.264视频失败了(编解码器未找到..)。
我了解到需要libx264进行H.264编码,需要libfdk-aac进行AAC编码。
因此,我尝试构建libx264和libfdk-aac,但无法轻松地交叉编译。
请告诉我我做错了什么。
我的开发环境为:
操作系统:ubuntu 13.10 64位
NDK:android-ndk-r9
FFmpeg:ffmpeg-2.0.2
x264构建脚本为:build_x264_android.sh
NDK=$ANDROID_NDK_HOME

TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
PLATFORM=$NDK/platforms/android-9/arch-arm
CPU=arm
PREFIX=$NDK/sources/ffmpeg-2.0.2/android/$CPU

./configure --prefix=$PREFIX \
    --enable-shared \
    --enable-pic \
    --disable-asm \
    --disable-cli \
    --host=arm-linux \
    --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
    --sysroot=$PLATFORM

make
make install
ldconfig

fdk-aac build : build_aac_android.sh

NDK=$ANDROID_NDK_HOME
CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
PLATFORM=$NDK/platforms/android-9/arch-arm
CPU=arm
PREFIX=$NDK/sources/ffmpeg-2.0.2/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a -mthumb -D__thumb__"

./configure --prefix=$PREFIX \
    --with-sysroot=$PLATFORM \
    --host=arm-linux \
    --enable-shared \
    --with-pic=no \
    CC="${CROSS_PREFIX}gcc --sysroot=$PLATFORM" \
    CXX="${CROSS_PREFIX}g++ --sysroot=$PLATFORM" \
    RANLIB="${CROSS_PREFIX}ranlib" \
    AR="${CROSS_PREFIX}ar" \
    STRIP="${CROSS_PREFIX}strip" \
    NM="${CROSS_PREFIX}nm" \
    CFLAGS="-O3 $OPTIMIZE_CFLAGS --sysroot=$PLATFORM" \
    CXXFLAGS="-O3 $OPTIMIZE_CFLAGS --sysroot=$PLATFORM"

make
make install

当我运行 'build_aac_android.sh' 时,显示错误。 config.log 中的日志
configure:2907: checking for arm-linux-gcc
configure:2934: result: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/platforms/android-9/arch-arm
configure:3203: checking for C compiler version
configure:3212: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/platforms/android-9/arch-arm --version >&5
./configure: line 3214: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc: No such file or directory
configure:3223: $? = 127
configure:3212: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/platforms/android-9/arch-arm -v >&5
./configure: line 3214: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc: No such file or directory
configure:3223: $? = 127
configure:3212: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/platforms/android-9/arch-arm -V >&5
./configure: line 3214: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc: No such file or directory
configure:3223: $? = 127
configure:3212: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/platforms/android-9/arch-arm -qversion >&5
./configure: line 3214: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc: No such file or directory
configure:3223: $? = 127
configure:3243: checking whether the C compiler works
configure:3265: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc --sysroot=/platforms/android-9/arch-arm -O3 -mfloat-abi=softfp -mfpu=vfpv3-d16 -marm -march=armv7-a -mthumb -D__thumb__ --sysroot=/platforms/android-9/arch-arm   conftest.c  >&5
./configure: line 3267: /toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc: No such file or directory

configure:3312: error: in `/home/nel/android-ndk-r9/sources/ffmpeg-2.0.2/libfdk-aac':
    configure:3314: error: C compiler cannot create executables
    See `config.log' for more details

我无法理解那个错误!我确认arm-linux-androideabi-gcc在目录中已找到。

我想借助您的智慧。请告诉我如何为Android构建“ffmpeg+x264+fdk-aac”。

谢谢.. :-)

3个回答

1
我知道现在已经很晚了。但我刚遇到这个问题并找到了你的提问。我按照以下方法解决了这个问题。希望这能帮助一些像我一样通过谷歌搜索找到你的问题的人们。这是如何为Android编译fdk-aac。NDK版本为9d。请相应更改ANDROID_ROOT和ANDROID_BIN。
export ANDROID_ROOT=/path/to/android-ndk/platforms/android-9/arch-arm
export ANDROID_BIN=/path/to/android-ndk/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin

export CFLAGS="-DANDROID -fPIC -ffunction-sections -funwind-tables -fstack-protector -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fomit-frame-pointer -fstrict-aliasing -funswitch-loops -finline-limit=300"

export LDFLAGS="-Wl,--fix-cortex-a8"
export CC="arm-linux-androideabi-gcc --sysroot=$ANDROID_ROOT"
export CXX="arm-linux-androideabi-g++ --sysroot=$ANDROID_ROOT"

export PATH=$ANDROID_BIN:$PATH

./configure --host=arm-linux-androideabi  --with-sysroot="$ANDROID_ROOT"  --enable-static --prefix="/tmp"
make -j4
make install

那么库将被安装到/tmp目录。您可以通过上面的--prefix更改它。


嗨@faraway,你的代码已经成功构建了,我可以将其包含在我的FFmpeg构建和Android项目中。我已经将libfdk-aac.so文件添加到我的项目中,但是当FFmpeg运行时,我会收到一个错误,指出找不到"libfdk-aac.so.1"。显然,FFmpeg链接的是“.so.1”,而Android只使用“.so”。你是否也遇到过这个问题?有什么解决办法吗? - Jon G
嗨@JonG,是的,我遇到了一些类似的问题。虽然我不太记得了,但我建议你在fdk-aac配置中使用enable-static或disable dynamic进行构建。请查看fdk-aac配置的标志。 - faraway

1
你可以尝试/fork/克隆我的库。它已经编译了x264和libfdk-aac。您可以使用任何版本的gcc工具链(如4.9),并支持最新的Android平台(21)。
您可以轻松地从我的repo中构建ffmpeg(2.6或最新版本),只需运行2-3个脚本即可。
很难解释如何同时编译,但您可以查看build_android.sh脚本,该脚本为所有体系结构编译x264和libfdk-aac。
您可以阅读bash函数build_aacbuild_x264,以了解如何进行交叉编译。 REPO: https://github.com/matthewn4444/VPlayer_lib INSTRUCTIONS: https://github.com/matthewn4444/VPlayer_lib/wiki/Compiling-FFmpeg

0

https://github.com/guardianproject/android-ffmpeg

以上项目用于Android包含x264。如果您熟悉git子项目和交叉工具链NDK构建,那么跟随构建应该很容易。

如果您不熟悉,您需要学习如何在Linux上构建ffmpeg(而非Android)。然后学习在Android上进行NDK构建,然后学习git子项目,最终进行构建。


我需要包含libfdk-aac。没有找到适用于Android的包含fdk-aac的项目? - Codeveloper
可以通过正确的配置设置添加Aac。FDK-AAC我不知道。 - Robert Rowntree
该版本的FFmpeg不支持fdk-aac。 - tuoxie007
这个项目包括fdk-aac: https://github.com/matthewn4444/VPlayer_lib/tree/master/ffmpeg_build - Kévin Berthommier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接