前言
說到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 )