您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
编译支持64位arm处理器的ffmpeg动态链接库(支持neon和'硬解码')
发布时间:2021-05-29 19:04:10编辑:雪饮阅读()
这里经过前面我们所编写的编译支持neon和硬解码以及编译不支持neon和硬解码的脚本进行改良优化。让其支持编译64位cpu的动态链接库。从前面看到我们目前项目主要使用的还是支持neon和硬解码方式编译出来的动态链接库。
所以这里为了减少性能消耗以及编译耗时以及调试脚本等考量,所以这里会删减前面脚本中同时支持编译支持neon和硬解码以及编译不支持neon和硬解码的逻辑,只保留编译支持neon和硬解码的逻辑。
最后再修改为支持编译64位的cpu的动态链接库。
那么脚本build_android_64.sh:
#!/bin/bash
echo "进入编译ffmpeg脚本"
NDK=/root/ff/android-ndk-r14b
#目录存在
PLATFORM=$NDK/platforms/android-21/arch-arm64
TOOLCHAIN=$NDK/toolchains/aarch64-linux-androideabi-4.9/prebuilt/linux-x86_64
#对于64位arm处理器来说在android-ndk-r14b(android-ndk-r14b-linux-x86_64.zip)版本来说,其cpu的值为armv8-a
CPU=armv8-a
#输出路径
PREFIX=./android/$CPU
#清理之前編譯的
make clean
function buildFF
{
echo "开始编译ffmpeg"
./configure \
--prefix=$PREFIX \
--target-os=android \
--cross-prefix=/root/ff/android-ndk-r14b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android- \
--arch=aarch64 \
--cpu=$CPU \
--sysroot=$PLATFORM \
--extra-cflags="$CFLAG" \
--extra-libs=-lgcc \
--enable-cross-compile \
--cc=/root/ff/android-ndk-r14b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-gcc \
--nm=/root/ff/android-ndk-r14b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-nm \
--enable-shared \
--enable-runtime-cpudetect \
--enable-gpl \
--enable-small \
--disable-debug \
--disable-static \
--disable-doc \
--disable-ffmpeg \
--disable-ffplay \
--disable-ffprobe \
--disable-ffserver \
--disable-postproc \
--disable-avdevice \
--disable-symver \
--disable-stripping \
$ADD
make -j4
make install
echo "编译结束!"
}
###########################################################
echo "编译支持neon和硬解码"
CPU=armv8-a
#PREFIX输出目录自定义
PREFIX=./android/arm64-neon-hard
CFLAG="-I$PLATFORM/usr/include -fPIC -DANDROID "
ADD="--enable-asm \
--enable-neon \
--enable-jni \
--enable-mediacodec \
--enable-decoder=h264_mediacodec \
--enable-hwaccel=h264_mediacodec "
buildFF
关于环境
系统:ubuntu16.04.3(64位)
Ndk:android-ndk-r14b(android-ndk-r14b-linux-x86_64.zip)
Ffmpeg: ffmpeg-3.4(ffmpeg-3.4.tar.bz2)
注意:
(1)arm64-v8a不支持 -mfloat-abi=softfp,所以相比之前armeabi-v7a来说,这个配置就丢弃了。(armv8 aarch64的AAPCS只支持hardfp)
(2)不用添加这个'-mfpu=neon'的编译器选项了,因为这个aarch64架构下neon是默认启动的。所以也相较之前去除了。
(3) --extra-libs=-lgcc选项是新增的,这里为了处理C compiler test failed错误时候在百度查资料添加的,但是现在看来这个选项应该是可有可无,因为错误原因应该就是前两项导致。
(4) --cross-prefix与—cc、--nm这三个的路径在aarch64下变化挺大,所以没有用前面的TOOLCHAIN变量了,都是写固定的,后面可以根据自己情况去改变。
(5) 需要安装gcc和yasm对于64位的arm动态链接库的编译来说,因为之前编译32位时候没有这个的相关错误(不过也应该是可选的,具体根据你的报错来确定吧,反正我这里这两个报错了),另外就是dos2unix可能你也需要,毕竟在window上编写脚本比vim或者vi爽的,但是传入linux中换行貌似需要处理,用dos2unix对传入的脚本文件进行处理之后就会解决这个问题的。
(6)编译出现其它问题可以参考ffmpeg源代码目录下的ffbuild/config.log的err级别错误日志信息。基本上我这里遇到的错误,都是从这个文件中分析排查出来的。
(7) "softfp"选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中。
编译结果:
![ffmpeg.png](/d/file/manshenghuo/chengxurensheng/8ca8325b564eaa88b2e21f1f96ec1895.png)
关键字词:arm,处理器,64位,ffmpeg,neon