ffmpeg专辑(一):linux编译ffmpeg.so入门

前言:在使用android进行音视频开发的时候,ffmpeg是一个利器。但是由于ffmpeg的编译涉及到交叉编译,让很多新手感到头疼。本系列将以多篇文章讲述如何编译so以及多种角度阐述原理。

本文使用环境:

编译环境:ubuntu16.04(在VMware15.5中运行)

ndk版本:android-ndk-r21e

ffmpeg版本:4.2.2

ffmpeg专辑(一):linux编译ffmpeg.so入门

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

ffmpeg专辑(三):linux编译ffmpeg.so多架构编译

ffmpeg专辑(四):linux编译ffmpeg.so合并so篇

ffmpeg专辑(五):android使用ffmpeg.so


至于ndk版本的一点说明:

ndk:在ndk17以前,都是使用gcc编译,官方从ndk17及以后,全面改用效率更高的clang编译器进行编译。且clang对ffmpeg版本没有很高的要求。

如果ndk选用不当(如ndk17以下使用clang编译),会造成意想不到的错误。本文选用较为稳定的组合进行演示,即:ndk21(clang编译器)+ ffmpeg4.2.2

至于ubuntu登录系统的说明:

本文登录用户按照最常见场景的原则,使用普通用户登录模式,后续linux命令行执行角色都是这个普通用户,非root模式。


步骤一、准备工作

1、进入ubuntu系统桌面,在根目录下新建一个目录,如:/home/liuzihui/softwaresCus,然后新建两个目录,分别用于存放ffmpeg源码和ndk工具包。

(图1)

注意:若vmware虚拟机里的ubuntu无法联网,也可以从windows里先下载好,再拷贝到wmware虚拟机里的ubuntu中的ffmpegSource目录中来。

ffmpeg网址(4.2.2版本):Download FFmpeg

2、ffmpeg源码下载:

在ffmpegSource目录下,在当前目录的终端(terminal)里使用命令下载ffmpeg4.2.2源码:

wget https://ffmpeg.org/releases/ffmpeg-4.2.2.tar.gz

 

 然后依然在当前目录的终端中,使用命令进行解压:

tar -zxvf ffmpeg-4.2.2.tar.gz

效果:

(图3)

3、ndk使用21Linux版本

可以先从windows里下载好,完成后再放到ubuntu中刚才的(图1)中的ndkr21目录中:

NDK 下载  |  Android NDK  |  Android Developers

 在ndkr21目录(图1中新建好的)执行终端解压命令:

unzip android-ndk-r21e-linux-x86_64.zip

效果:

说明:在很多教程中,都说ndk需要设置linux的环境变量,其实是不用的,完全可以在后续操作中写明全路径避免掉配置环境变量带来的研究成本。


步骤二:正式编译

经过步骤一,ffmpeg4.2.2和ndkR21的源码和工具包全部已经下载完毕,准备工作已经做好。接下来进行编译的具体讲解。

1、我们进入到(图3)中的 /home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2 目录中,新增一个编译用的脚本文件:build_androidv7.sh(可以先在windows新增并编辑,然后拷贝到该目录下),内容如下:

#!/bin/bash
make clean
#变量定义,变量前面的export可要可不要,如export API
API=21   #选择一个ndk有的,且期望兼容的android版本
ARCH=arm
CPU=armv7-a
OUTPUT=/home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2/android/$CPU #so输出路径,写好进行,编译完成后自动生成该目录
NDK=/home/liuzihui/softwaresCus/ndkr21/android-ndk-r21e
TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64 #有的ndk是叫darwin-x86_64,看ndk目录对应
SYSROOT=$TOOLCHAIN/sysroot

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=$TOOLCHAIN/bin/arm-linux-androideabi- \
  --cc=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang \
  --cxx=$TOOLCHAIN/bin/armv7a-linux-androideabi$API-clang++ \
  --extra-cflags="-fPIC"
echo "===========================2========================"
make clean
make
make install

我需要对上述sh脚本进行一些讲解:

①API、ARCH、CPU、OUTPUT、NDK、TOOLCHAIN、SYSROOT是脚本语言的一种写法,可以理解为变量定义。网上有的在之前加了export xx,其实可加可不加。其中OUTPUT的输出目录,不需要手动创建,脚本会自行新建;

②echo进行了一个打印,这样做的好处就是在编译时,可以一开始就明显看到哪里脚本哪里没有配置对,利于排障。有一点需要注意,即使我们写错了脚本,但是编译过程虽然报错,但是依然在执行,且生成了一些so文件,这是为什么?是因为他帮我们执行了默认的脚本,这点需要注意,最好多次实践比较下;

③最重要的是cc和cxx的强制指定。因为在有些教程中,提及到了cc_default、cxx_default的问题,甚至要去修改ffmepg源码文件。其实这里大可不必大费周章且可维护性不强,直接在这里指定cc和cxx的路径,可以直接找到位于ndk路径中的cc和cxx的clang编译器(如:/home/liuzihui/softwaresCus/ndkr21/android-ndk-r21e/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi21-clang)

而cross-prefix前缀是留给AR、AS、LD用的,需要指定下,且脚本中已指定;

④ffmpeg4.2.2源码中已经支持直接指定target-os=android,而非旧版本的linux,故无需再修改configure文件中的SLIBNAME_WITH_MAJOR命名;

⑤本脚本只对armeabi-v7a架构进行了编译,若要编译arm64-v8a,请关注博主后续分享;

⑥在windows编辑好的build_androidv7.sh文件,拷贝到linux中,一般会遇到dox文件格式转unix文件格式的问题(比如报错:/bin/bash^M: bad interpreter),解决方案:

i、方案一:sed -i 's/\r//' build_androidv7.sh;

ii、方案二:可以先vim该脚本文件,然后执行“: set ff=unix”,然后:wq保存。若在编译的时候,还是有问题,这时候可以右击该sh文件,选择open with gedit打开,再保存一下;

⑦请注意,脚本内容中./configure后续的命令项中不要加任何注释,否则在某些系统环境中会出问题,且要确保\符号后面没有多余不可见的空格字符串;

⑧本次sh脚本,会编译出libavdevice,libavcodec,libavfilter,libavformat,libavutil,libswresample,libswscale共7个so文件,后续文章会讲解如何进行so裁剪

2、脚本写好后,接下来就是编译了(注意,要在 /home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2 目录下执行terminal终端命令,如下图

①赋予build_androidv7.sh、configure两个文件的可执行权限:

chmod +x build_androidv7.sh
chmod +x configure

  ②执行编译脚本:

./build_androidv7.sh

③等待几分钟,便可以看到 /home/liuzihui/softwaresCus/ffmpegSource/ffmpeg-4.2.2 目录下自动生成了android目录,且lib目录里有我们需要的so文件,同时ffmpeg-4.2.2目录下也自动生成了本次编译生成的宏头文件config.h,里面记录了脚本过程:

④若想重新编译,先删除android目录,再次执行./build_androidv7.sh命令即可。ctrl+C快捷键可以中断编译。


ps:最近博主开放了一个免费的备忘录网站,有喜欢的可以使用:

www.huayezi.com


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

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

祝大家生活工作愉快~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值