iOS中多个直播框架的兼容

问题描述

如果一个iOS app中使用了多个直播框架,并且这两个框架都依赖了ffmpeg,比如一个app中使用了IJKPlayer.framework和360水滴SDK,那么就可能出现其中一个框架无法播放视频或者无法编译的问题。

目标

app中原使用了自定义直播协议的以ffpmeg解码的视频直播SDK。现在要能够播放RTMP协议的视频源。

尝试方案一

使用自己写的以ffmpeg为核心的编解码视频库SDK。该SDK包括录制、保存、推流、直播等功能,因为不好拆解,全部接入有些功能使用不到,因此放弃而选择IJKPlayer。编译接入IJKPlayer用来播放RTMP协议的视频源,原SDK保持不变。当接入IJKPlayer.framework后可以编译通过,但原直播视频无法播放。原因是两个框架都依赖了ffmpeg,两者的ffmpeg不兼容。因为不确定原直播SDK的ffmpeg是否做了改变,因此没有选择统一ffmpeg版本的解决方案。

IJKPlayer:  https://github.com/bilibili/ijkplayer

IJKPlayer的应用:https://github.com/zhangfangtaozft/ZFTPlayer

尝试方案二

因为不确定原直播SDK的ffmpeg是否做了改变,不能选择统一ffmpeg版本的解决方案,因此使用VLCPlayer,VLCPlayer未依赖ffmpeg。

VLC: https://github.com/videolan/vlc

VLCPlayerd的应用:https://github.com/dklinzh/DLCMobilePlayer

当接入VLCPlayer.framework后出现跟方案一同样的问题。经过查找VLCPlayer底层得知:

VLC does not embed FFmpeg as a sort of slave binary used internally, as you possibly could suppose. Instead, both FFmpeg and VLC are using libavcodec, a library which implement what ffmpeg exposes through its command line interface. So, FFmpeg supports VLC through supplying its libavcodec library to be one of the essential components on which the VLC is built as a player app.

引自:https://stackoverflow.com/questions/11525769/how-do-vlc-and-ffmpeg-work-together

因此放弃这种解决方案。

尝试方案三:

经确认原视频播放软件的ffmpeg已做过修改,因此尝试使用一个ffmpeg版本兼容两套视频解码方式的方案。

1. 首先确定版本号:ff4.1时,云室可播放,ijk闪退,提示如下图。

iOS中多个直播框架的兼容_第1张图片
图1

2.  编译ff3.2版本。ijkplayer可以播放,云室内不可以播放。

使用一键编译脚本:https://github.com/kewlbear/FFmpeg-iOS-build-script

3.  放弃ff3.2版本,全部升级到ff4.1。编译ff4.1的ijkplayer。

编译以ff4.0步骤:https://juejin.im/post/5bfd3b73e51d456ee054a22b

ijkplayer依赖的ffmpeg: https://github.com/bilibili/FFmpeg/releases。使用上面的编译脚本编译 ff4.0--ijk0.8.25--20190305--001成功。注意要在build-ffmpeg.sh中去掉armv7的编译。将该ffmpeg放在工程中,出现如下报错:(放弃)

iOS中多个直播框架的兼容_第2张图片

4. 使用ijkplayer提供的编译脚本编译出现两个报错:图一表示去掉armv7的编译。图二表示在config/module-lite中去掉报错中为未识别的optional。编译成功

iOS中多个直播框架的兼容_第3张图片
iOS中多个直播框架的兼容_第4张图片

合成模拟器和真机IJKMediaPlayer.framework:  https://www.jianshu.com/p/7b2f1df74420

5. 将合成的framework放到工程中,出现如下报错。猜测ijkplayer的编译脚本有问题,因此将使用上面第三条中编译的ffmpeg替换到工程中。

iOS中多个直播框架的兼容_第5张图片
x

编译成功!!!

6. 通过使用文件对比工具,查找云室ffmpeg与新编译ffmpeg的差别,兼容解码方式。(一般不会遇到该情况,请略过,遇到了只有幸运者才能兼容)。

兼容后:

播放云室内视频,有画面,且流畅!!!

播放RTMP视频,有画面,且流畅!!!

至此

你可能感兴趣的:(iOS中多个直播框架的兼容)