15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

【ffmpeg】二、linux编译ffmpeg.so脚本改良与裁编

前言:在上一章已经介绍了,如何进行编译ffmpeg.so的一个完整过程。但是用的编译脚本较为基础,本章将要介绍如何优化以及ffmpeg的指定模块编译(裁剪)。注意,本系列从第二篇开始,会对脚本结构进行微调,目的是为了大家能举一反三,在使用中做到逐渐熟练其原理。

一、脚本优化

对于脚本优化,这里我将利用脚本中的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即是我们指定模块编译的,且编译过程中我们可以看到,编译速度有大幅提升) 

anyShare分享到:
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。
stormwind