说到android的多媒体,一把辛酸一把泪,当初据说会多媒体的比较牛掰,公司也有需求,因而乎我也积极的加入研究android多媒体的行列,记得之前刚接触的时候,最开始仍是比较头大的,主要是可是不少细节比较零散凌乱,没法造成规律模式和合理的解决方案,可是慢慢也虽然接触了久了,不少事情也就明白过来了,接触android三年多四年了,慢慢的也有些学习和作事的体会,多媒体的接触过程更加的强化个人学习规律,由于最近公司事情比较少,基本没有加班,晚上就写写本身的博客,分享下之前学习多媒体过程,下面我也给出个人学习心得吧你们共同交流探讨:css
作事有先有后有顺序,这样会有调理不会乱,这个体会甚至也潜移默化的影响着个人生活,有时我和别人进行聊天交流的时候也会列出个A、B、C来讲明天问题或者本身的观念认知。android
每一个人都有本身的学习习惯和学习规律,不少时候本身在学习的过程当中要常常回忆总结本身一些规律是否有改进的地方;就拿我举例子,记得最初学习就拿着什么就开始学,处处查资料、网上百度这些,教程看来看去的,很担忧有什么重要的东西给遗漏了,不少东西都是感受当时记得可是后面基本全忘了,这个过程让我很痛苦,我花了比别人更多的时间去对某个问题进行分析理解,为何要忘呢?也多是资源太多看的东西太多忘了本了,也多是脑壳装不下,也许是我笔记比较作得很差,平时事情也比较多不少东西也总之就是感受零零散散的处处都是重点,不少东西也比较凌乱。慢慢的我总结了以下规律:git
(1)经常使用网络记事本作笔记,进行归类和条理化程序员
(2)遇到问题尽可能造成解决方案并进行深刻的分析探究记录和尽量写下先后解决的过程和遇到的问题服务器
(3)积累小知识点,不要以为网上能找到就不记录,有些地方只是简单的一两行代码,可是也须要用规范的方法积累,不能小看不要忽略;好比我偶尔会遇到须要把LsitView中间的线去掉,还有就是ListView中的每项须要得到焦点,当初是去网上搜索下并解决了(很简单),我就没有单独作笔记,只是在代码了作了笔记,后来在其余地方要用的的时候,我发现我都记不得当时具体的处理方法(代码),具体之前在哪里用过也很差找太多了,又去网上搜索,感受真的很浪费时间,像这种小的细节不少,感受之前遇到过,如今又忘了。网络
(4)常常分享本身解决方案,并尽量详细记录,其实不少东西当时明白了没有详细的记录后面又会陌生,这样能够加深本身的理解,好比我对android视频播放,慢慢的就变陌生了,如今我又专门来整理下帮助我加深印象。框架
(5)学习和作东西不要走来就进入主题,先要规划从一个新的高度进行入手ide
(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自带的播放组件的多媒体框架使用的是OpenCore,播放格式支持
音频:mp3 wma
视频:3gp mp4 新的版本好像支持avi(具体支持到什么程度没有测试)
收音机:
FM:调频收音机(频道、频段)
HTTP:支持该协议网络收音机
MMS:android SDK不支持该协议网络收音机
vitamio是一个第三方的比较强大完美的播放框架,使用的是ffmpeg媒体解析器和最主要的解码器,同时开发了针对不一样移动平台的硬解码方案
支持的播放格式就很少说,能够到官网(https://www.vitamio.org/)去详细查看,反正android SDK支持的它都支持,android SDK不支持的它也支持,不管视频仍是音频格式支持以及字幕这些都比较全面。
百度媒体云播放器 SDK 内嵌百度自主研发的 T5 播放内核,对目前主流的本地和网络媒体都提供了良好的功能支持
百度媒体云经过提供一系列HTTP Restful API及跨终端平台SDK,实现包括媒体存储、编码、转码、内容保护、点播、直播、分析、广告以及人脸检测、人脸识别、语音技术等的诸项功能。 固然咱们暂时讨论他的播放SDK。
ffmpeg是一套能够用来记录、转换数字音频、视频,并能将其转化为流的开源框架,支持平台普遍,andorid须要用jni编译。
至于ffmpeg,小弟就不过多献丑了,你们都比我懂,我也在向别人学习中,我推荐两篇博客给你们吧,他们都出于同一人,反正我是膜拜他了
第一个:仍是符合个人胃口,能照葫芦画瓢 http://blog.csdn.net/leixiaohua1020/article/details/47008825
第二个:很是的深刻 http://blog.csdn.net/leixiaohua1020/article/details/15811977/
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是一个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(由于集成的成本低且免费)
若是项目比较特殊需求,好比随时的调整视频质量、支持HTML五、Flash等。这个时候就得具体的选对比相关播放sdk的侧重点来选择(由于涉及的东西太多,我也没有时间和精力具体的去比较,没法给出各类状况比较合理的选择)。
Android 多媒体视频播放二( MediaPlayer+SurfaceView )