ffmpeg编译还是挺繁琐的,里面的参数需要消化,然后配置出自己需要的,arm64-v8a相应的网上比较少,想用这种试试,都是armeabi的多,这种cpu现在很少了。
1. 版本
ffmpeg:ffmpeg-4.3
ndk:android-ndk-r20
目标:arm64-v8a下的.so /include
#可自己辨别下,这边完成编译后,再回头写的,可能解压的文件名不是这个
wget http://www.ffmpeg.org/releases/ffmpeg-4.3.2.tar.xz
tar -zxvf ffmpeg-4.3.2.tar.xz
cd ffmpeg-4.3
touch build.sh
#修改操作权限,可读写执行
chmod 777 build.sh
vim build.sh
build.sh配置如下
# NDK=${NDKROOT},$NDKROOT为ndk的根目录
# 注意:ndk-r20不再使用以前r18等版本的路径<以前版本的路径也是做了内部调用,指向/llvm/下+target等参数>,r20下等较新需要改为llvm/
SYSROOT=$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64/sysroot
#TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录
TOOLCHAIN=$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64
echo $NDKROOT
echo $TOOLCHAIN
#--cc=$TOOLCHAIN/bin/aarch64-linux-android28-clang \
# --cxx=$TOOLCHAIN/bin/aarch64-linux-android28-clang++ \
# --nm=$TOOLCHAIN/bin/aarch64-linux-android-nm \
function build()
{
#--prefix:设置安装目录,重要
#--enable-small:优化大小,重要
#--target-os=android:不给不行,会做目标os辨别,然后if取相应的值,重要
#--arm=aarch64: armv8-a需设置为aarch64,重要,可aarch64;arm
#--sysroot:编译时指定了逻辑目录,重要
#--cross-prefix:交织编译东西链,会做前缀<cross-prefix> + clang等路径拼接,重要,枚举:aarch64-linux-android-;arm-linux-androideabi-
#--cc:clang编译工具的具体地址,可换成arm-linux-androideabi-,重要
#--cxx:clang++编译工具的具体地址,可换成arm-linux-androideabi-,重要
#--extra-ldflags=-L/usr/local/x264-x86/lib :是编译安装的x264模块,看需求
#--extra-cflags="-Os fpic $ADDI_CFLAGS":会传给gcc的参数,重要
# fpic:生成与位置无关,详见:https://blog.csdn.net/a_ran/article/details/41943749
#--enable-gpl 选择许可证,FFMPEG默认许可证LGPL 2.1,如果需要加gpl的库
# 需要使用gpl的许可证,例如libx264就是gpl的,如果需要加入libx264则需要
# 加上,详见:https://blog.csdn.net/ericbar/article/details/81079955
#--enable-shared:生成动态库,默认不生成动态库
#--disable-static:不生产静态库,默认生成静态库
#--enable-pthreads:开启多线程编解码,注意不是php的pthreads,sysroot变量如果和cc、cxx不匹配,
# 须指定双方都是$NDKROOT/toolchains/llvm/prebuilt/linux-x86_64下的,否则会导致ERROR: pthreads requested but not found
#--disable-ffmpeg:禁用ffmpeg命令行形式模块 <<可以参照ffmpeg交叉编译-1模块说明>>
#--disable-ffplay:禁用ffplay模块 <<可以参照ffmpeg交叉编译-1模块说明>>
#--disable-ffprobe:禁用多媒体码流分析器
#--disable-ffserver:ffserver负责响应客户端的流媒体请求,把流媒体数据发送给客户端
#--disable-avdevice : 关闭avdevice模块,此模块在android中无用
#--disable-encoders:关闭所有编码器 (播放不需要编码)
#--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 ),重要
echo 123456 | sudo -S ./configure \
--prefix=${PREFIX} \
--enable-small \
--disable-programs \
--target-os=android \
--arch=aarch64 \
--sysroot=${SYSROOT} \
--cross-prefix=$TOOLCHAIN/bin/aarch64-linux-android- \
--cc=$TOOLCHAIN/bin/aarch64-linux-android28-clang \
--cxx=$TOOLCHAIN/bin/aarch64-linux-android28-clang++ \
--extra-ldflags="$ADDI_LDFLAGS" \
--extra-cflags="$ADDI_CFLAGS -Os -fPIC -DANDROID -Wfatal-errors -Wno-deprecated" \
--enable-gpl \
--enable-shared \
--disable-static \
--enable-pthreads \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-encoders \
--disable-avdevice \
--enable-protocols \
--enable-filters \
--enable-cross-compile
make clean
#开启多核编译,编译速度快一些
make -j6
#生成目标.so和include头文件列表
make install
}
CPU=arm64
PREFIX=./android/$CPU
#marm功能优于mthumb百分之10到15,mthumb兼容性更好,可以调试用marm,发版用mthumb ADDI_CFLAGS="-marm",可换成-march=arm
ADDI_CFLAGS="-march=armv8-a"
#-I/usr/local/include
#ADDI_LDFLAGS="-L/usr/local/lib"
build
#执行脚本,可先把build中的make先注释掉,configure没有错误后再make安装,错
#误信息会放在ffmbuild/config.log,可用xftp取出来查看最后报什么错,如果报xxxx.h
#文件找不到等,基本也是configure配置里面有错误,需要逐一比对排查
./build.sh
#编译结果在ffmpeg4.3/android下,
cd ./android/arm64/
[atguigu@hadoop01 arm64]$ tree ./ -L 2
./
├── include
│ ├── libavcodec
│ ├── libavfilter
│ ├── libavformat
│ ├── libavutil
│ ├── libpostproc
│ ├── libswresample
│ └── libswscale
├── lib
│ ├── libavcodec.so
│ ├── libavfilter.so
│ ├── libavformat.so
│ ├── libavutil.so
│ ├── libpostproc.so
│ ├── libswresample.so
│ ├── libswscale.so
│ └── pkgconfig
└── share
└── ffmpeg
可参考:
Android 音视频学习系列:https://www.jianshu.com/p/1f89638e25c1
FFmpeg 参数解析:https://blog.csdn.net/yzhang6_10/article/details/77104211
编译 FFmpeg 之 clang:https://blog.csdn.net/qq_39756073/article/details/99837603
网友评论