android 上的静态链接 FFmpeg 库
Static linking FFmpeg libraries on android
我正在尝试为 android 构建 FFmpeg 作为 静态库 在 MacOS Sierra 机器上。
以下是我的 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
.
里面
我的问题:
当尝试使用 -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice
、
从我的应用程序 link 到这些 .a
库时
我得到以下 linker error for each of them
:-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)
查看 this discussion here,我通过在 CPREFIX
中选择 arm-linux-androideabi-ar
来正确执行此操作。
为了解决这个错误,我还为 ranlib
添加了以下配置标志,专门为 android 选择,但似乎没有帮助。
RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
我的问题:
- 我还缺少什么?
- 我的
buildscript.sh
需要什么来选择正确的 ranlib 并在从我的应用程序 link ing 时停止抱怨存档符号 table?
以下是正确的配置标志:
./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"
花了一天时间尝试使用更新的 x265 为 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 更新为某些包的依赖项并且开始令人头疼。
总结一下:'stable' cmake 的 ffmpeg+x265 版本是 3.10.2 和 3.21.0
我正在尝试为 android 构建 FFmpeg 作为 静态库 在 MacOS Sierra 机器上。
以下是我的 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
.
我的问题:
当尝试使用 -lavformat -lavcodec -lswscale -lavutil -lavfilter -lswresample -lavdevice
、
从我的应用程序 link 到这些 .a
库时
我得到以下 linker error for each of them
:-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)
查看 this discussion here,我通过在 CPREFIX
中选择 arm-linux-androideabi-ar
来正确执行此操作。
为了解决这个错误,我还为 ranlib
添加了以下配置标志,专门为 android 选择,但似乎没有帮助。
RANLIB=$TOOLCHAIN/bin/arm-linux-androideabi-ranlib
我的问题:
- 我还缺少什么?
- 我的
buildscript.sh
需要什么来选择正确的 ranlib 并在从我的应用程序 link ing 时停止抱怨存档符号 table?
以下是正确的配置标志:
./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"
花了一天时间尝试使用更新的 x265 为 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 更新为某些包的依赖项并且开始令人头疼。 总结一下:'stable' cmake 的 ffmpeg+x265 版本是 3.10.2 和 3.21.0