千帆过境方解油盐非易事
青丝渐白才知岁月不饶人
编译
因为在windows下编译ffmepg老出问题,所以还是选择ubuntu来编译ffmpeg来编译成so文件放到Android中使用
环境和准备工作
- AndroidStudio用来检验和使用so库
- Ubuntu18.04系统(可以使用虚拟机安装)
- FFmpeg 4.2.2
- NDK(android-ndk-r20b)
- make(编译脚本中需要使用)
安装make工具
打开终端输入:
sudo apt-get install make
因为我这边已经安装了就不演示了(这个一般不会有问题)
安装NDK
ndk下载路径
大家可以自己选择自己对应ndk的版本(我这里选择20b的)
`注意:要下载linux版本的
直接解压,或者使用命令:
tar -jxvf android-ndk-r20b.zip
配置ndk环境
打开终端输入:
sudo gedit ~/.bashrc
进入编辑,在文档最后添加配置
export NDK=/home/xx/Downloads/android-ndk-r20b
export PATH=$PATH:$NDK
最后保存,然后再终端输入:
source ~/.bashrc
接着测试下是否安装完成:
ndk-build
下载ffmpeg
打开终端:
- 下载 ffmpeg-4.2.2
wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.bz2
- 解压 FFmpeg
tar -jxvf ffmpeg-4.2.2.tar.bz2
配置configure脚本
- 新增
cross_prefix_clang
参数
进入到ffmpeg-4.2.2
目录下,打开configure
文件,搜索CMDLINE_SET
就可以找到,在里面新增一条
CMDLINE_SET="
$PATHS_LIST
ar
arch
as
assert_level
build_suffix
cc
objcc
cpu
cross_prefix
cross_prefix_clang
custom_allocator
...省略
复制代码
- 修改编译工具路径
搜搜 ar_default="${cross_prefix}${ar_default}"
修改注释中间的两行
ar_default="${cross_prefix}${ar_default}"
#------------------------------------------------
cc_default="${cross_prefix_clang}${cc_default}"
cxx_default="${cross_prefix_clang}${cxx_default}"
#------------------------------------------------
nm_default="${cross_prefix}${nm_default}"
pkg_config_default="${cross_prefix}${pkg_config_default}"
复制代码
这个部分可以参考下大佬的文章,也可以选择用旧版的gcc进行编译,新版本的是支持clang了
新增ffmpeg编译脚本
在ffmpeg-4.2.2
根目录下新建shell
脚本,build_ffmpeg_for_android.sh
#!/bin/bash
echo ">>>>>>>>> 编译硬件解码版本 <<<<<<<<"
echo ">>>>>>>>> 注意:该编译环境目前只在 NDK20b + ffmpeg4.2.2 测试过 <<<<<<<<"
echo ">>>>>>>>> 注意:该编译环境目前只在 NDK20b + ffmpeg4.2.2 测试过 <<<<<<<<"
#你自己的NDK路径.
export NDK=/home/hmh/Downloads/android-ndk-r20b
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
function build_android
{
echo "开始编译 $CPU"
./configure \
--prefix=$PREFIX \
--enable-neon \
--enable-hwaccels \
--enable-gpl \
--enable-postproc \
--enable-shared \
--disable-debug \
--enable-small \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--disable-static \
--disable-doc \
--enable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-avdevice \
--disable-doc \
--disable-symver \
--cross-prefix=$CROSS_PREFIX \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--cc=$CC \
--cxx=$CXX \
--enable-cross-compile \
--sysroot=$SYSROOT \
--extra-cflags="-Os -fpic $OPTIMIZE_CFLAGS" \
--extra-ldflags="$ADDI_LDFLAGS"
make clean
make
make install
echo "编译成功 $CPU"
}
#armv8-a
ARCH=arm64
CPU=armv8-a
API=21
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-march=$CPU"
build_android
#armv7-a
ARCH=arm
CPU=armv7-a
API=16
CC=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang
CXX=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++
SYSROOT=$NDK/toolchains/llvm/prebuilt/linux-x86_64/sysroot
CROSS_PREFIX=$TOOLCHAIN/bin/arm-linux-androideabi-
PREFIX=$(pwd)/android/$CPU
OPTIMIZE_CFLAGS="-mfloat-abi=softfp -mfpu=vfp -marm -march=$CPU "
build_android
复制代码
- 注意上面配置修改你的ndk。
编译遇到的坑:
armv7a-linux-androideabi-clang is unable to create an executable file
解决方案:查找发现原先的ffmpeg是默认支持gcc的,在4.2.2版本则默认支持clang。这个也可能是我早起选择版本问题。
打开configure配置文件,搜索"$target_os"
if test "$target_os" = android; then
# cc_default="clang"
cc_default="gcc"
fi
复制代码
- make未安装导致无法编译(这一部分忘记截图了)
解决:安装make工具sudo apt-get install make
- 静态库和动态库切换
#开启动态库
--enable-shared \
#关闭静态库
--disable-static \
复制代码
编译完成
编译的文件
总结
之前在windows下编译各种问题和配置,最后还是虚拟机安装ubuntu来编译快一些。ffmpeg编译到此结束了,Android的集成案例放到下一篇,怕文章太长影响耐性。小白刚入音视频的坑,有不对的地方还希望大佬指点。