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