Ijkplayer、ExoPlayer、VLC播放器综合比较

VLC Media Player

VLC 是VideoLAN 计划所研发的工程,最早预1996年开始,是一个完全的跨平台播放器,适合Windows、Mac OS、Linux、Android、iOS等系统,目前完全的跨平台播放器很少,VLC是最受欢迎的一种播放器;目前累计下载13亿次,是真真正正的全球播放器;

VLC的整体框架是设计成一套module的管理机制,将功能分类并抽象成modules。
VLC main: player的main。初始化libVLC 并加载用户界面。
libVLCcore:libvlc的核心,抽象出了一个libvlc_instance_t 对象,提供modules的装载/卸载机制。
modules: modules提供具体的功能,比如上面的access,demux,decode就是以一个模块的形式存在。
External libraries:外部开源库。

下面将VLC中各modules串起来的流程:


优点:
1.跨平台,兼容性好;
2.功能全面,支持rtsp、rtmp、ftp、http、https等协议;
3.代码完全解耦,modules相互独立,不影响,引入新modules方便;
4.维护团队强大,更新频繁;
缺点:
1.Android平台编译出的包较大,有16M左右;

IjkPlayer

IjkPlayer 是BiliBili公司维护的一个开源工程,是基于ffmpeg开发的一个播放器软件,目前支持Android和iOS两种平台,ffmpeg是音视频领域的大山,基本上做音视频开发的根本绕不过去,所以ijkplayer采用ffmpeg作为音视频播放器的基础也是可以理解的;
ffmpeg中提供了ffplay 和 SDL(Simple DirectMedia Layer) 功能模块,是ffmpeg 视频播放的集大成;整个ijkplayer就是以ffplay为基础展开的;

IjkPlayer的架构以FFplay为核心,FFplay基于FFmpeg,FFmpeg具备强大的扩展性,所以Ijkplayer的拓展能力主要是FFmpeg的拓展能力;
IjkPlayer的整体流程比较清晰;主要的流程如下:
优点:
1.ijkplayer结构比较简单,基本以ffplay展开,开发难度较小;
2.ijkplayer包比VLC小一点,经过裁剪,约为4.2M左右;
缺点:
1.ijkplayer可扩展性较差,基本上没有提供modules供开发者二次开发;
2.ijkplayer 官方维护力度小,版本更新很慢;

ExoPlayer

ExoPlayer 是google推出的开源播放器,主要是集成了Android 提供的一套解码系统来解析视频和音频,将MediaCodec封装地非常完善,形成了一个性能优越,播放稳定性较好的一个开发播放器,目前主要用于Youtube项目;由于Google的大力推广,目前非常流行,ExoPlayer包大小轻便,接入简单;
优点:
1.接入包小,1.1M;
2.维护团队强大,更新速度快;
缺点:
1.不太适合直播;
2.视频解码无法接入软解,可扩展性一般;
3.适合播放场景简单的项目,播放过程中无切换码流的情况;


ExoPlayer 会替代MediaPlayer成为Android平台上的默认播放器吗?
不会,两个原因:

  • Android 5.0 之后Android的Codec架构做了依次重大调整,放弃了AwesomePlayer ,使用NuPlayer架构,ExoPlayer 没有做过多的兼容;
  • ExoPlayer 目前还是一个小而轻的播放器,如果要合成到系统中,它需要调整的东西太多,代码量会变得很繁杂,很可能得不偿失;

综合分析

对于Android 团队在播放器选型这一块,我个人比较建议ijkplayer,理由如下:
1.ijkplayer 基于ffmpeg,软解效果非常好,可以支持所有的协议;
2.ijkplayer可以解决直播过程中切换码流导致花屏的情况;
3.ijkplayer 代码相对简单,入手较快;

为什么不选择VLC?
1.VLC 为了兼容所有的平台,有些库选择的不是非常合理,导致Android平台编出来的包很大;
2.VLC代码虽然高度解耦,但是用到了很多不常见的库,学习成本较大;

为什么直播过程中切换码流会导致花屏问题?
这儿我简单阐述一下,因为ExoPlayer主要是采用硬解码和系统提供的部分软解码,软解码非常有限,我们知道硬解码是通过GPU工作的,提供相应的GPU指令来操作GPU实现解码的功能;
我们初始化播放器的时候,就会根据当前的视频格式来初始化MediaCodec,然后底层OMX调用对应的GPU指令工作;如果直播过程中存在切换码流的请求,对于ExoPlayer而言,就要重新初始化一个新的MediaCodec实例,这时候会触发GPU重新生成一个dev node,在这个过程中不会平滑执行的,存在花屏的情况;
而软解码是通过CPU工作的,我们将运算矩阵送入CPU计算,得到相应的原始数据,这个过程中,只是包含计算,不需要操作底层的dev node,整体的执行不存在中断的可能;所以不会存在花屏;

关于播放器的几点建议:
1.如果已知的播放场景比较简单,例如小视频场景,都是mp4视频(h264/aac格式),强烈建议使用ExoPlayer,没有比这更适合的;
2.涉及到多种视频交互形式,直播、长视频等,还是建议引入软件的形式;
3.如果Android平台不介意包大小,推荐使用VLC,VLC更新频繁,官方维护相当给力;如果比较关注包大小,建议选择ijkplayer,ijkplayer目前的缺点是维护的不那么勤了;
4.长远来看,国内很多播放器都从接入ijkplayer开始,逐渐演化,去掉不适合自己产品的代码,引入自己需要的module,渐渐变成自己的播放器;

下面看看七牛播放器的演进之路:
v1.1.0版本:


v1.2.0版本:

拿来使用,吸收内功,更新迭代,推陈出新

推荐阅读更多精彩内容