基于android的ffmpeg的编译
获取 ffmpeg源码
我编译的ffmpeg 版本是 4.1.4 ,另外我使用的 ndk 是23的版本。我是在ubuntu下进行编译。
git clone --branch n4.1.4 https://gitee.com/mirrors/ffmpeg.git
编译方法
- 首先修改 configure 文件 修改默认的c和c++编译器(将gcc和g++改成 clang和clang++)
# cc_default="gcc"
cc_default="clang"
# cxx_default="g++"
cxx_default="clang++"
- 修改 configure 文件中的 strip_default(为了解决 make install 找不到 strip 的错误,当然不作strip 也可以)
# strip_default="${cross_prefix}${strip_default}"
strip_default="$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-${strip_default}"
- 运行配置并编译
#你自己的NDK路径。
export ANDROID_NDK=/home/cc/data/cc/Android/Sdk/ndk/23.0.7344513
# 设置你的android平台编译器的版本
export SYSROOT=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
#编译使用的toolchain
export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64
export CPU=aarch64 # 我是基于 armv8-a的 cpu编译的
# export CPU=armv8-a # 一定不要填 armv8-a 因为根本就没有 armv8-a-linux-android21-clang
export ANDROID_NATIVE_API_LEVEL=android21
# 这个是输出的路径
export PREFIX=$(pwd)/android/$CPU
export ADDI_CFLAGS="-DBIONIC_IOCTL_NO_SIGNEDNESS_OVERLOAD"
./configure --target-os=linux \
--prefix=$PREFIX --arch=$CPU \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/$CPU-linux-$ANDROID_NATIVE_API_LEVEL- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $ADDI_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS" \
--disable-indev=v4l2
make -j4
make install
遇到的错误
- 配置的时候没有忽略 v4l2
我首先百度了一下 然后参考 https://www.jianshu.com/p/feab970fd74c ,最初的配置如下:
export ANDROID_NDK=/home/cc/data/cc/Android/Sdk/ndk/23.0.7344513
export SYSROOT=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64
export CPU=aarch64
export ANDROID_NATIVE_API_LEVEL=android21
export PREFIX=$(pwd)/android/$CPU
./configure --target-os=linux \
--prefix=$PREFIX --arch=$CPU \
--disable-doc \
--enable-shared \
--disable-static \
--disable-x86asm \
--disable-symver \
--enable-gpl \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-doc \
--disable-symver \
--cross-prefix=$TOOLCHAIN/bin/$CPU-linux-$ANDROID_NATIVE_API_LEVEL- \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic"
然后就遇到了错误
libavdevice/v4l2.c:135:9: error: assigning to 'int (*)(int, unsigned long, ...)' from incompatible type '<overloaded function type>'
SET_WRAPPERS();
最后参考 https://github.com/tanersener/mobile-ffmpeg/issues/48
- 变量名与宏定义重名
错误如下:
libavcodec/hevc_mvs.c:368:23: error: use of undeclared identifier 'y0000000'
错误原因是因为有个头文件中有 B0 的宏定义,然后报错的c文件中的也有变量名叫 B0(另外还有有2个文件都是因为这个重名原因出现错误 libavcodec/hevc_mvs.c、libavcodec/opus_pvq.c)。
ps: 百度查编译的时候大部分博客没啥参考意义,一直到最后我都快编译完了 看到一个还不错的博客:
http://xu6148152.github.io/2019/01/20/使用NDK编译FFmpeg4-1/