Ijkplayer、ExoPlayer和VLC播放器对比

本文为大家分享Ijkplayer、ExoPlayer,VLC Media Player 三款播放器的基本概况以及各自优缺点,方便大家选择播放器的时候可以做下参考。

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 目前还是一个小而轻的播放器,如果要合成到系统中,它需要调整的东西太多,代码量会变得很繁杂,很可能得不偿失。

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左右。

综合分析

对于Android 团队在播放器选型这一块,我觉得根据情况选择ijkplayer或者exoplayer;

  • 如果你的播放场景比较简单,播放的视频源比较单一,例如短视频,建议选择exoplayer;
  • 如果你的播放场景比较复杂,有直播场景,特别是涉及到播放过程中码流的切换,还是选择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,渐渐变成自己的播放器。

作者:JeffMony

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论