ffmpeg专辑(二):linux编译ffmpeg.so脚本改良与裁编

前言:在上一章已经介绍了,如何进行编译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:最近博主开放了一个免费的备忘录网站,有喜欢的可以使用:

www.huayezi.com


好了,本次专辑(二)就讲到这里了,更多内容,请期待下次的讲述

欢迎有问题的伙伴及时留意讨论,有不足之处还望指正

祝大家生活工作愉快~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值