Android 多媒体视频播放一( 多媒体理解与经验分享)
前言
说到android的多媒体,一把辛酸一把泪,当初听说会多媒体的比较牛掰,公司也有需求,于是乎我也积极的加入研究android多媒体的行列,记得以前刚接触的时候,最开始还是比较头大的,主要是但是很多细节比较零散凌乱,无法形成规律模式和合理的解决方案,但是慢慢也虽然接触了久了,很多事情也就明白过来了,接触android三年多四年了,慢慢的也有些学习和做事的体会,多媒体的接触过程更加的强化我的学习规律,因为最近公司事情比较少,基本没有加班,晚上就写写自己的博客,分享下以前学习多媒体过程,下面我也给出我的学习心得吧大家共同交流探讨:
第一:学习东西和做事情还是有必要列出个一、二、三来:
做事有先有后有顺序,这样会有调理不会乱,这个体会甚至也潜移默化的影响着我的生活,有时我和别人进行聊天交流的时候也会列出个A、B、C来说明天问题或者自己的观念认知。
第二:学习观念的改变和学习规律总结让事半功倍:
每个人都有自己的学习习惯和学习规律,很多时候自己在学习的过程中要经常回忆总结自己一些规律是否有改进的地方;就拿我举例子,记得最初学习就拿着什么就开始学,到处查资料、网上百度这些,教程看来看去的,很担心有什么重要的东西给遗漏了,很多东西都是感觉当时记得但是后面基本全忘了,这个过程让我很痛苦,我花了比别人更多的时间去对某个问题进行分析理解,为什么要忘呢?也可能是资源太多看的东西太多忘了本了,也可能是脑袋装不下,也许是我笔记比较做得不好,平时事情也比较多很多东西也总之就是感觉零零散散的到处都是重点,很多东西也比较凌乱。慢慢的我总结了如下规律:
(1)常用网络记事本做笔记,进行归类和条理化
(2)遇到问题尽量形成解决方案并进行深入的分析探究记录和尽可能写下前后解决的过程和遇到的问题
(3)积累小知识点,不要觉得网上能找到就不记录,有些地方只是简单的一两行代码,但是也需要用规范的方法积累,不能小看不要忽略;比如我偶尔会遇到需要把LsitView中间的线去掉,还有就是ListView中的每项需要获得焦点,当初是去网上搜索下并解决了(很简单),我就没有单独做笔记,只是在代码了做了笔记,后来在其他地方要用的的时候,我发现我都记不得当时具体的处理方法(代码),具体以前在哪里用过也不好找太多了,又去网上搜索,感觉真的很浪费时间,像这种小的细节很多,感觉以前遇到过,现在又忘了。
(4)经常分享自己解决方案,并尽可能详细记录,其实很多东西当时明白了没有详细的记录后面又会陌生,这样可以加深自己的理解,比如我对android视频播放,慢慢的就变陌生了,现在我又专门来整理下帮助我加深印象。
(5)学习和做东西不要走来就进入主题,先要规划从一个新的高度进行入手
(6)还是要多花时间去研究某块自己比较感兴趣的知识业务
第三:多交流合作,共同进步:
android很多东西,谁要真的到处都学都深入去理解还真的学不完,很多东西变化也比较快,要相互交流相互帮助。比如RecyclerView组件,我也是从朋友那里听说的。
第四:提高高度,整体把控,去掉枝叶零碎:
学习新的东西的时候很多未知尽量找出解决方案,首先要从基本面入手,特别是新的领域,不要拿着一个东西就使劲学往里面钻,当然很多东西网上资料太多,有很多又不全面,有时候看多了就零散凌乱,当有需要的时候再往里面深入专研。记得最开始学习多媒体的时候,网上一百度FFMPEG、VLC比较完美强大牛逼,我就是追求小小的完美,于是乎我就把精力放在了FFMPEG上面,研究了一天多发现我看不懂,于是去学习JNI,前后搞了一周多,发现FFMPEG里面很多C,对于我android开发的去看C,我只能说无解,勉强能看懂简单的东西,后面小小的尝试了下居然还有自己去优化FFMPEG,于是乎直接放弃,回头看又去拿别人编译好的FFMPEG这些来用。后面回想在整个过程中我发现我暂且不说FFMPEG,我觉得主要的工作还是在做视频播放的基本业务逻辑,但是我开始忽视了很多基本的东西,连很多播放的小细节都无法处理,比如当用手机竖屏拍的视频,播放的时候横屏播放,视频一下子变小了,等等这些如何处理。慢慢东学西学的虽然也学了点但是我觉得我学的东西好凌乱,什么jni、vlc、vitamio、ffmpeg,感觉效率很低很多都是缺乏高度且不实际特别是ffmpeg,最后发现他们其实就是解码和播放引擎不一样,一般的应用只是把视频界面和业务逻辑处理好,调用不同的引擎就可以了,因为在平时项目用的时候很少要对各种格式进行处理,一般情况就是程序中包含了一点小视频,都是普通的格式无需大动干戈,就用android自己的media player或者videoview就可以了,除非是专门做视频方面的android程序,如果是专门做视频处理各种格式,那么会了基本的东西,去用不同的的引擎那就简直是小菜了一碟了,他们的业务基本相差无几,什么播放、暂停、快进、当前进度…,当然如果专门优化库(ffmpeg)另当别论,一般是做C的。
说了那么多口水话,现在进入正题吧,我也尝试着用我的学习理解思路来展现整个过程,如有补充或者错误请大家积极留言进行补充更改,谢谢!
首先
我们先不谈具体代码和实现过程,代码会让人凌乱,让我们从另一个方向或者高度来学习,先整理下思路,我们来看看android的多媒体有哪些解决方案:
(1)android SDK自带的 MediaPlayer+SurfaceView或者videoview (简单快速,格式支持少)
(2)vitamio (简单快速开发,格式支持全面)
(3)百度媒体云 (简单快速开发,格式支持多)
(4)ffmpeg (非常折腾,格式支持全面)
(5)VLC (比较麻烦,格式支持全面)
(6)Exoplayer (一般般,格式支持少,仅MP4)
(7)其他还要很多开源的播放器格式支持也比较多,比如 ijkplayer、AwesomePlayer…
其次
我们来简单的对比下这些解决方案,看看他们的区别和使用选出最适合项目的解决方案:
第一:多媒体框架区别
android SDK
android SDK自带的播放组件的多媒体框架使用的是OpenCore,播放格式支持
音频:mp3 wma
视频:3gp mp4 新的版本好像支持avi(具体支持到什么程度没有测试)
收音机:
FM:调频收音机(频道、频段)
HTTP:支持该协议网络收音机
MMS:android SDK不支持该协议网络收音机
vitamio
vitamio是一个第三方的比较强大完美的播放框架,使用的是ffmpeg媒体解析器和最主要的解码器,同时开发了针对不同移动平台的硬解码方案
支持的播放格式就不多说,可以到官网(https://www.vitamio.org/)去详细查看,反正android SDK支持的它都支持,android SDK不支持的它也支持,无论视频还是音频格式支持以及字幕这些都比较全面。
百度媒体云
百度媒体云播放器 SDK 内嵌百度自主研发的 T5 播放内核,对目前主流的本地和网络媒体都提供了良好的功能支持
百度媒体云通过提供一系列HTTP Restful API及跨终端平台SDK,实现包括媒体存储、编码、转码、内容保护、点播、直播、分析、广告以及人脸检测、人脸识别、语音技术等的诸项功能。 当然我们暂时讨论他的播放SDK。
ffmpeg
ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源框架,支持平台广泛,andorid需要用jni编译。
至于ffmpeg,小弟就不过多献丑了,大家都比我懂,我也在向别人学习中,我推荐两篇博客给大家吧,他们都出于同一人,反正我是膜拜他了
第一个:还是符合我的胃口,能照葫芦画瓢 http://blog.csdn.net/leixiaohua1020/article/details/47008825
第二个:非常的深入 http://blog.csdn.net/leixiaohua1020/article/details/15811977/
VLC
VLC多媒体播放器(最初命名为VideoLAN客户端)是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影音光盘及各类流式协议。它也能作为unicast或multicast的流式服务器在IPv4或 IPv6的高速网络连接下使用。它融合了FFmpeg计划的解码器与libdvdcss程序库使其有播放多媒体文件及加密DVD影碟的功能。
在android平台开发那么就不得不提vlc for android,vlc for android是一款开源安卓播放器,具备播放多媒体文件、光盘、设备以及网络流媒体协议等功能,支持ARMv7 CPU或一个x86 CPU的设备,所有播放控制特性都已经开发完整。也是我们android程序员研究vlc的很好的例子。
Exoplayer
ExoPlayer是一个google在2014年才推出的介于现有MediaPlayer和自定义媒体播放器之间的预建播放器;但是比原有Mediaplayer更多的扩展能力,由于其基于MediaPlayer API Level 16+开发, 所以其只支持API Level 16+, 即Android 4.1+,
特点
(1)相比MediaPlayer具有更多特性和可扩展性:
(2)支持Dash和Smoothstreaming播放;
(3)Android4.3+支持DRM(Digital Rights Management);
(4)丰富的回调API, 可用于自定义播放器定制.
注意:ExoPlayer 是一个开源项目,它不属于Android framework ,并且是独立于Android SDK独立分发的。该项目包含一个library和一个demo,其中展示了ExoPlayer的简单应用及其高级定制。
其他开源播放器
其他开源的播放器一般是基于ffmpeg进行开发的。
第二:开发或者集成难度
根据我的经验来判断,其难度或者集成的时间成本
FFMPEG :ffmpeg无疑是里面最难的,成本是最大的,并且里面的优化还得需要非常专业有经验的团队(注意是团队不是个人)来完成。如果有个人要完成此工程那么我只是膜拜你个人能力和情怀,但是不赞成你的这种做法。
VLC:其实除了ffmpeg最难之外,其他的都算不上有多么难,vlc只是比较麻烦费时间,vlc for android的出现让我们接触它又更加的容易了,但是要处理的事情还是非常的多
vitamio:个人感觉vitamio是非常成熟第三方的播放器,集成的难度也比较小,并且支持的视频音频格式非常的全面,我很喜欢该框架
百度媒体云:媒体云播放器来说,单纯的做播放功能集成起来还是非常的方便的,当然如果要做云服务比如需要将视频传到百度云平台进行转码或者加广告这些等等还是需要做很多的事情的
ExoPlayer:ExoPlayer开发成本还是比较低的,其实和MediaPlayer+SurfaceView差不多,很简单
其他开源的播放器:我个人认为其他开源播放器已经有demo,开发难度应该比较小,主要是看部署的时候或者使用的时候会不会遇到莫名的错误或者问题,一般情况都是比较ok的,不同的开源他的侧重点不同,但是都满足基本的视频播放多种格式的支持。
个人觉得开发成本或者集成的难度系数从大到小依次是
FFMPEG > VLC > 其他开源的播放器 > Exoplayer >= MediaPlayer+SurfaceView > 百度媒体云 >= vitamio> videoView
第三:使用费用
从官方给出的信息来看,只有vitamio ,百度媒体云 有相关的涉及到使用付费的项目外其他的都无需付费。但是从具体的付费情况来看,百度媒体云只是用他的相关的播放SDK也无需付费,vitamio 分为标准版和至尊版,其中标准版免费限个人开发者使用。
总结:对于多媒体播放功能除了vitamio需要付费使用,其他的都免费使用。但是如果使用百度云付费的还是比较棒的,能够给我各种分析的报告,也能解决播放流媒体协议问题,因为一般情况下小公司用的是HTTP协议。
最后
上面介绍了那么多,我们在项目中具体开发的时候到底选用什么样的流媒体解决方案呢??我给出我的选择规则
(0)项目是否是专门或者主要做视频播放软件
(1)确定需要播放什么格式
(2)老板是否接受付费(vitamio,媒体云),一般情况是不接受
(3)集成的难度和成本
根据以上规则:
如果是该android项目做的是多媒体相关的软件,无论实际情况怎么样,首先得选一个播放格式支持全而多的框架(vlc,其他开源项目、百度媒体云、FFMPEG,vitamio ),这些里面选择。
如果里面只是简单的嵌套一个小视频并且格式只是简单的低码率的3GP、MP4就直接考虑android自带SDK( MediaPlayer+SurfaceView或者videoview )
如果嵌套一个小视频但是支持的格式比较多个人建议考虑百度云播放SDK(因为集成的成本低且免费)
如果项目比较特殊需求,比如随时的调整视频质量、支持HTML5、Flash等。这个时候就得具体的选对比相关播放sdk的侧重点来选择(因为涉及的东西太多,我也没有时间和精力具体的去比较,无法给出各种情况比较合理的选择)。
接下来进入代码篇:从简单的基本入手来一步步走进android的多媒体世界
Android 多媒体视频播放二( MediaPlayer+SurfaceView )