由于公司应用的播放器kxmovie已经很久没有更新,近期,领导让我对应用内的播放器使用较新的播放器进行替换,我考虑了一下,最后决定用在直播中使用量比较多的ijkplayer播放器。此处,我记录下我完成此需求的步骤和遇到的各种坑:
首先,在github上找到这个库ijkplayer,其实已经有很详细的使用方法。后来在简书中找到了这篇文章iOS中集成ijkplayer视频直播框架,对整个ijkplayer的编译和打包静态库做了很详细的介绍,按照这个步骤搞很快就做完了。我自以为没啥难度,但是当我将打包好的静态库及相关系统库添加完后,运行时居然崩溃了,搞得我一脸懵逼,最后在工程内又找到了一个ffmpeg的静态库,此时我突然想起来,肯定是ijkplayer内的ffmpeg静态库与工程内已存在的ffmpeg静态库冲突,导致的崩溃。随后,我按照下面地址的这篇文章iOS 项目中包含多个 FFMPEG 方法冲突的通用解决办法。的方法,将工程内的ffmpeg替换为与ijkplayer库内同一个版本的库。
然后,在ffmpeg官网,通过比对相应头文件的版本,确定工程内使用的是2.7.7版本的ffmpeg,而ijkplayer则使用3.4.4版本。所以我决定将工程内以前存在的就版本进行升级。我参考iOS项目中编译和集成FFmpeg这篇文章,没多久就生成了一份新3.4.4版本的ffmpeg静态库,此过程中需要对sh文件进行编辑,修改一下要编译的ffmpeg版本。
当我把编译后的静态库替换掉之前工程内的库后,居然无法编译,报了一堆错。根据报错信息,发现升级Xcode9之后,工程中FFmpeg中的avutil.h下的AVMediaType与系统的AVFoundation框架冲突了。按照Xcode9 FFmpeg冲突问题这篇文章,将3.4.4源码内涉及到的枚举全部进行替换,并重新编译3.4.4的ffmpeg静态库。随后用新的静态库,公司的应用工程内之前我们自己实现的编解码部分用到了ffmpeg的部分内容,更换新版的库后,一些枚举名称发生了改变,之前调用的某些函数已经被遗弃了,经过一段时间的修改,终于解决了所有问题,终于可以正常运行。
正当我以为万事大吉的时候,居然发现以前应用内涉及到投屏的部分功能用不了了,看了下以前的代码,才发现之前这个工程要用到H264的编解码这块内容,我猜测应该是需要将libx264编译到FFmpeg才行。随后参考iOS FFmpeg+libx264包的产生这篇文章,先下载并编译x264静态库,然后再将x264编译到ffmpeg,同时将两个库都导入我们应用,最后运行并验证,所有功能都正常了。本以为集成ijkplayer视频播放框架很简单,结果居然引起了这么多的坑,一步步解决完,内心的大石头终于可以落地了。