前言:在上一章已经介绍了,如何进行编译ffmpeg.so的一个完整过程。但是用的编译脚本较为基础,本章将要介绍如何优化以及ffmpeg的指定模块编译(裁剪)。注意,本系列从第二篇开始,会对脚本结构进行微调,目的是为了大家能举一反三,在使用中做到逐渐熟练其原理。
ffmpeg专辑(一):linux编译ffmpeg.so入门
ffmpeg专辑(二):linux编译ffmpeg.so脚本改良与裁编
ffmpeg专辑(三):linux编译ffmpeg.so多架构编译
ffmpeg专辑(四):linux编译ffmpeg.so合并so篇
ffmpeg专辑(五):android使用ffmpeg.so
一、脚本优化
对于脚本优化,这里我将利用脚本中的function关键字进行脚本的提取,与上一篇不同,为了对比学习,这次针对单架构arm64-v8a(向下兼容64和32位)进行编译,脚本如下:
build_androidv8.sh
内容:
#!/bin/bash
make clean
API=21
NDK=/home/liuzihui/softwaresCus/ndkr21/android-ndk-r21e
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
#function方法名后面一定要有空格,否则报错
function build_android {
echo "===========================1========================"
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-asm \
--enable-neon \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-ffmpeg \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cc=$CC \
--cxx=$CXX \
--extra-cflags="-fPIC" \
$ADDITIONAL_CONFIGURE_FLAG
echo "===========================2========================"
make clean
make
make install
}
#arm64-v8a
ARCH=arm64
CPU=armv8-a
OUTPUT=/home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2/android/$CPU
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android- #AR AS LD等通用
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang #CC单独指定,非通用
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ #CXX单独指定,非通用
ADDITIONAL_CONFIGURE_FLAG= #自定义附件选项,比如加”--disable-xxx –enable-xx”,其中,引号要带上
build_android
注意:这里和上一章不同的是用到了function关键字进行封装,然后部分变量定义(如ARCH、CPU等)放在了下面(其实这样做有别的好处,即多架构编译,后面文章会讲到)。
在上一篇文章中的ffmpeg-4.2.2源码目录下,终端命令:赋予权限和执行脚本:
chmod +x build_androidv8.sh
./build_androidv8.sh
效果:
二、指定模块编译(裁剪)
裁剪的意思是只编译部分我们需要的ffmpeg模块,这样不仅可以减小输出包大小,也能大幅度提高编译速度。
但是在介绍裁剪之前,我们需要了解哪些能裁剪,这就要了解ffmpeg8大模块他们之前的依赖关系:
由此可以看出,avtuil是一个非常底层的模块,不可以不编译,其余模块可以按照他们的依赖关系,进行选择性编译,下面就编译 arm64-v8a 架构下avfilter模块作为示例:
build_androidv8cut.sh
#!/bin/bash
make clean
API=21
NDK=/home/liuzihui/softwaresCus/ndkr21/android-ndk-r21e
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
SYSROOT=$TOOLCHAIN/sysroot
function build_android {
echo "===========================1========================"
./configure \
--prefix=$OUTPUT \
--target-os=android \
--arch=$ARCH \
--cpu=$CPU \
--enable-asm \
--enable-neon \
--enable-cross-compile \
--enable-shared \
--disable-static \
--disable-doc \
--disable-ffplay \
--disable-ffprobe \
--disable-symver \
--disable-ffmpeg \
--sysroot=$SYSROOT \
--cross-prefix=$CROSS_PREFIX \
--cc=$CC \
--cxx=$CXX \
--extra-cflags="-fPIC" \
$ADDITIONAL_CONFIGURE_FLAG
echo "===========================2========================"
make clean
make
make install
}
#arm64-v8a
ARCH=arm64
CPU=armv8-a
OUTPUT=/home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2/android/$CPU
CROSS_PREFIX=$TOOLCHAIN/bin/aarch64-linux-android- #AR AS LD等通用
CC=$TOOLCHAIN/bin/aarch64-linux-android$API-clang #CC单独指定,非通用
CXX=$TOOLCHAIN/bin/aarch64-linux-android$API-clang++ #CXX单独指定,非通用
ADDITIONAL_CONFIGURE_FLAG="--disable-avdevice --disable-avcodec --disable-avformat --disable-swresample --disable-swscale --disable-postproc --enable-avfilter"
#avdevice,avcodec,avformat,swresample,swscale,postproc,avfilter可选不编译(都是默认开启的,avutil基本的,也是默认开启),为了提升编译速度和仅供演示,这里仅开启avfilter
build_android
注意:这里用 ADDITIONAL_CONFIGURE_FLAG 自定义变量指定了可编译选项,具体项目变量可自己定义别的名称,也可以不用该变量,直接写在./configure编译脚本中。
依然在ffmpeg-4.2.2源码目录下,终端命令:赋予权限和执行脚本:
chmod +x build_androidv8cut.sh
./build_androidv8cut.sh
效果:(libvutil.so是基础so,必生成,libavfilter.so即是我们指定模块编译的,且编译过程中我们可以看到,编译速度有大幅提升)
ps:最近博主开放了一个免费的备忘录网站,有喜欢的可以使用:
好了,本次专辑(二)就讲到这里了,更多内容,请期待下次的讲述
欢迎有问题的伙伴及时留意讨论,有不足之处还望指正
祝大家生活工作愉快~
转自:
https://blog.csdn.net/minping9101/article/details/131510827