文| iOS开发by文明 编译任意版本FFmpeg
FFmpeg功能强大音视频处理框架,特点:开源、跨平台,底层用c语言实现,几乎没有什么视频格式是他不能播放的。
大公司做音视频开发的人员几乎都会用到它,它的主要作用是编解码,至于显示要用到SDL,iOS端显示视频帧是用openGLES,这方面的资料一般都比较陈旧,而且资料比较少,门槛高,导致人才断层。FFmpeg官网:http://ffmpeg.org/download.html。
本篇文章的目的是教会大家编译任意版本的FFmpeg,跳过作者遇到的坑,节省时间,提高研究FFmpeg的积极性。网上的编译教程太多了,简书、CSDN、github,看的我眼花缭乱,看教程也是很蛋疼,有些作者写的不清楚,导致大家普遍编译出错,我就是被坑的一位。
研究FFmpeg少不了要去编译,熟悉FFmpeg的人应该知道,github有人开源出过编译FFmpeg的脚本,https://github.com/kewlbear/FFmpeg-iOS-build-script。FFmpeg-iOS-build-script这个脚本,可以直接转为iOS编译可用的FFmpeg库,我们不用下载FFmpeg,脚本会帮我们下载指定版本的FFmpeg,并且打包成一个iOS可用的FFmpeg库。我们有两种方式得到编译后的.a和文件,一种是直接去下载别人的demo或者是下载百度云盘里面的copy进你项目使用;另一种是自己编译。当然是自己动手丰衣足食更好了,想编译什么版本都可以,目前大部分人使用的还都是老版本的FFmpeg,记得我群里的大葱同学使用的是2.8版本,ijkPlayer用的是3.4版本的,kxmovie用的也是3.x版本的,(顺便提一句kxmoive年久失修,4年没有更新了,如果我们用FFmpeg的最新版本导入到kxmoive是不兼容的了,有些方法已经废弃,有些流程已经改变)而FFmpeg官网已经推出最新版本4.0.1。下载后的脚本文件默认下载的FFmpeg的版本是FF_VERSION="3.4.2",打开build-ffmpeg.sh脚本文件,搜索FF_VERSION即可定位到。
编译前的其他步骤我就不一一详细解说了,什么下载gas-preprocessor.pl,下载homebrew,下载yasm,这些步骤可以自行百度其他的文章,不是本文章重点介绍的内容,其实上面的脚本文件里面也是有下载homebrew和yasm的逻辑的,
> if [ "$COMPILE" ]
>
> then
>
> if [ ! `which yasm` ]
>
> then
>
> echo 'Yasm not found'
>
> if [ ! `which brew` ]
>
> then
>
> echo 'Homebrew not found. Trying to install...'
>
> ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" \
>
> || exit 1
>
> fi
>
> echo 'Trying to install Yasm...'
>
> brew install yasm || exit 1
>
> fi
>
> if [ ! `which gas-preprocessor.pl` ]
>
> then
>
> echo 'gas-preprocessor.pl not found. Trying to install...'
>
> (curl -L https://github.com/libav/gas-preprocessor/raw/master/gas-preprocessor.pl \
>
> -o /usr/local/bin/gas-preprocessor.pl \
>
> && chmod +x /usr/local/bin/gas-preprocessor.pl) \
>
> || exit 1
>
> fi
仔细阅读可以看出,里面判断了如果没有homebrew就去下载,如果没有yasm就去下载,如果没有gas-preprocessor.pl就去下载,可以说作者在脚本文件内部帮我们一次性搞定了。
我们从编译开始讲起,cd到下载的脚本目录,然后执行编译命令./build-ffmpeng.sh,其实如果你下载后按照其他文章的步骤去编译,100%是失败的,下面是我在终端编译的报错信息,屡试不爽,还有文章说:如果失败,多尝试几次即可下载到,我试过很多次,都是失败。
> FFmpeg source not found. Trying to download...
>
> % Total % Received % Xferd Average Speed Time Time Time Current
>
> Dload Upload Total Spent Left Speed
>
> 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
>
> building arm64...
>
> ./build-ffmpeg.sh: line 134: /Users/apple/Downloads/FFmpeg-iOS-build-script-master-2/ffmpeg-3.4.2/configure: No such file or directory
仔细看这句/Users/apple/Downloads/FFmpeg-iOS-build-script-master-2/ffmpeg-3.4.2/configure: No such file or directory。意思是下载ffmpeg3.4.2的时候发现找不到文件(No such file or directory),瞬间懵逼了,说好的封装呢?说好的内部处理呢?都TM是骗人的。下面是一个我随便在简书上找到的编译教程截图,不知道作者有没有试过,就写出来,坑爹,一句话就带过了,看了他的文章等于没看,就给了一个编译命令./build-ffmpeng.sh。
image其实安装他们的教程我们是离成功只有一步之遥,那就是我们需要修改一下build-ffmpeg.sh文件,把里面的FF_VERSION="3.4.2"改一下,改为FF_VERSION="3.4",3.4.2是一个3.4版本的小分支,目前不知道为什么是下载不到的,只能下载3.4主分支,修改后就可以轻松编译通过了。所以我们得出一个结论,如果拉取不到小分支,那么就去拉取主分支;如果主分支也拉取不到,那么你就要去看看是否存在这个版本的主分支,FF_VERSION对应的版本号不是乱写上去的,是要去官网查看有哪些版本release了,然后去对应你想要的版本,copy一个版本号到FF_VERSION这里,千万不能随心所欲,写一个不存在的版本。
但是编译成功了也是3.4版本,或者是3.4以下的版本呀,并不是最新版本呀!怎么才能呼应到文章的标题,编译任意版本的FFmpeg。
要想下载3.4版本以上的FFmpeg版本,比如如果想下载最新的4.0.1,就需要更复杂的步骤,这个已经有大神编译成功了,我们只要按照下面这个链接的步骤认真去做,那么我们最后肯定会得到一个编译失败!!!
https://github.com/DeviLeo/DLGPlayer/blob/master/How_to_build_ffmpeg_with_openssl.md。
哈哈,毫不夸张,我编译这几个版本的FFmpeg,周六周日每天都编译到凌晨3点左右,最终还是给我编译出来了。其实我们需要修改FF_VERSION为4.0.1就可以了,而作者明确的是写4.0,下面有图为证。又一次被坑,这个是主分支下载不到,要用小分支4.0.1。
但是还是要感谢一下作者,其他的步骤特别详细,特别清楚,只要大家跟着步骤做,然后修改我让大家修改的地方,就一定可以编译成功。
image至此我们应该是有能力去编译任意版本的FFmpeg了,感谢大家的阅读。
网友评论