时间:2017-10-05 21:02:35

标签: ffmpeg android-ndk static-libraries static-linking configure

我正在尝试在 MacOS Sierra计算机上为 android 构建 FFmpeg 作为静态库

以下是我的buildscript.sh,它非常基于here

中的#!/bin/bash cd ffmpeg-3.3.4 NDK=/path/to/android/ndk/android-ndk-r15c SYSROOT=$NDK/platforms/android-21/arch-arm64/ TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64 AR=$TOOLCHAIN/bin/arm-linux-androideabi-ar CPREFIX=$TOOLCHAIN/bin/arm-linux-androideabi- CC=$TOOLCHAIN/bin/arm-linux-androideabi-gcc CXX=$TOOLCHAIN/bin/arm-linux-androideabi-g++ LD=$TOOLCHAIN/bin/arm-linux-androideabi-ld RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib STRIP=$TOOLCHAIN/bin/arm-linux-androideabi-strip X264LIB=$X264/android/arm/lib/ X264INC=$X264/android/arm/include/ function build_ffmpeg_android { ./configure \ --prefix=$PREFIX \ --disable-stripping --arch=arm \ --cpu=cortex-a8 \ --target-os=linux \ --enable-cross-compile \ --enable-pic \ --disable-programs \ --enable-static \ --disable-shared \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --disable-doc \ --enable-postproc \ --enable-swscale \ --enable-avfilter \ --enable-avresample \ --disable-opencl \ --disable-securetransport \ --enable-gpl \ --sysroot=$SYSROOT \ --extra-cflags="-Os -fpic $ADDI_CFLAGS -I$X264INC" \ --extra-ldflags="$ADDI_LDFLAGS -s -L$X264LIB -lx264" \ --enable-gpl \ --enable-decoders \ --enable-encoders \ --enable-muxers \ --enable-demuxers \ --enable-parsers \ --enable-protocols \ --enable-filters \ --enable-avresample \ --enable-libfreetype \ --disable-indevs \ --enable-indev=lavfi \ --disable-outdevs \ --enable-hwaccels \ --enable-ffmpeg \ --disable-ffplay \ --disable-ffprobe \ --disable-ffserver \ --disable-network \ --enable-libx264 \ --enable-zlib \ --enable-muxer=md5 make clean make -j9 make install } CPU=arm PREFIX=$(pwd)/android/$CPU ADDI_CFLAGS="-marm" build_ffmpeg_android
ffmpeg-3.3.4/android/arm

上述脚本的输出位于.a内。

我的问题:
尝试使用-lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice从我的应用链接到这些:-1: error: error: avformat: no archive symbol table (run ranlib) :-1: error: error: avcodec: no archive symbol table (run ranlib) :-1: error: error: swscale: no archive symbol table (run ranlib) :-1: error: error: avutil: no archive symbol table (run ranlib) :-1: error: error: avfilter: no archive symbol table (run ranlib) :-1: error: error: swresample: no archive symbol table (run ranlib) :-1: error: error: avdevice: no archive symbol table (run ranlib) 库时, 我为每个

获得了以下链接器错误
arm-linux-androideabi-ar

查看this discussion here,我选择CPREFIX中的ranlib来做到这一点。

尝试解决这个错误,我还为RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib 添加了以下配置标志,专门针对Android进行了选择,但似乎没有帮助。

buildscript.sh

我的问题:

  • 我还缺少什么?
  • 我的.splice(index, 1)需要选择正确的ranlib&从我的应用程序链接时停止抱怨存档符号表?

2 个答案:

答案 0 :(得分:3)

以下是正确的配置标志:

./configure \
  --prefix=$PREFIX \
  --disable-stripping \
  --arch=arm \
  --cpu=armv5te \
  --disable-asm \
  --target-os=linux \
  --enable-cross-compile \
  --enable-debug \
  --enable-pic \
  --disable-programs \
  --enable-static \
  --disable-shared \
  --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \
  --disable-doc \
  --enable-postproc \
  --enable-swscale \
  --enable-avfilter \
  --enable-avresample \
  --disable-opencl \
  --disable-securetransport \
  --sysroot=$SYSROOT \
  --enable-videotoolbox \
  --enable-avresample \
  --disable-symver \
  --extra-cflags="-O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID -DNDEBUG-march=armv5te -mtune=arm9tdmi -msoft-float"
  $ADDITIONAL_CONFIGURE_FLAG
  make clean
  make -j9
  make install

注意以下cflags在android

上有所不同
--extra-cflags="-O3 -Wall -pipe -std=c99 -ffast-math -fstrict-aliasing -Werror=strict-aliasing -Wno-psabi -Wa,--noexecstack -DANDROID -DNDEBUG-march=armv5te -mtune=arm9tdmi -msoft-float"

答案 1 :(得分:1)

花了一天时间尝试使用更新的 x265 for Android 构建 ffmpeg。

x265 成功编译成静态库,但是当需要将它包含在 ffmpeg 中时,我收到错误:

...aarch64-linux-android/bin/ld.gold: error: x265: no archive symbol table (run ranlib)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
C compiler test failed.

在网络上很难找到有关此错误的任何信息,而且我几乎尝试了所有方法。 但是...在我的情况下您所要做的就是更新您的 CMAKE 版本。

cmake 3.20.5 is installed but outdated
==> Upgrading cmake
  3.20.5 -> 3.21.0 

在此之前,我有 cmake 3.10.2.4988404 并且一切都按预期工作,然后 Homebrew 将 cmake 更新为某些软件包的依赖项,开始头痛。 总结一下:ffmpeg+x265 的“稳定”版本的 cmake 是 3.10.23.21.0