解碼庫區別 一些應該學習的開源框架與庫用途和差別
vlc/ffmepg/mplayer/gstreamer/openmax/mpc/ffdshow/directshow
修bug修得頭疼,看看自己的部落格,坑挖了一堆,出來混,遲早是要還的,這裡先補一個。
剛開始看多媒體這塊時,總是發現有新框架,新平臺,新名詞弄得雲山霧繞,為了避免重複google/wiki,我嘗試做個總節吧。
之前寫過codec與container的區別,這裡就不多說了,更近應用層的東西。
這些東西大概有:vlc/ffmepg/mplayer/gstreamer/openmax/mpc/ffdshow/directshow...
這些軟體,所涉及的層面和針對的應用場景,系統各不相同,按層次分別說一下。
一.播放器層次
這個層次上,是直接可以用的軟體,已經做完了一切工作,如果我們需要用他們,是不需要寫一行程式碼的,編譯通過就可以拿來使用了,對於國內這些山寨公司來說,基本就是拿來就可以騙錢的檔次了。
包括 vlc/mplayer/mpc,這裡我只是簡介一下,我就不費勁從維基和官網複製東西了,貌似網上其他文章也都是從這兩個地方複製了點東西,毫無營養。
其中vlc與mplayer都是跨平臺的,都是起源於linux界的大佬,後來逐漸發展到跨平臺了。
vlc,外掛機制的播放器,非常靈活,但是總覺得這貨速度太慢,不過可移植平臺比較多,ios/android/win8。。。。等等都有他的身影。
mplayer,單執行緒,狀態機機制的播放器,比較古老,程式碼有些凌亂。
mpc,是windows平臺上的開源播放器,基於filter機制,像qq影音/射手播放器/百度影音/.......一系列windows上的播放器,都是脫胎於這個軟體。
這套軟體不太爽的一點是,只能在windows上執行,不能移植到其他平臺,原因是他的使用了windows的directshow框架。
這裡有篇文章,是講述這些播放器的架構與應用的,非常經典。來自射手播放器的部落格
二.框架層次
主要包括gsteamer/directshow/openmax
1.gstreamer是基於gnome的基礎類庫gobject所寫的一套,開源多媒體框架。主要針對於linux,當然windows上也可以使用。
基本設計思路類似於directshow,區別只是
gstreamer基本部件是component(元件,demux/codec/access/等,都可以當成一個元件),對directshow來說,對應的概念是filter。
gstreamer各個元件的連結是pipe(管道,元件間傳遞資料,通訊的機制),對directshow來說,對應的概念是pin。
對於這個框架一些比較典型應用就是meego/tizen手機平臺上的媒體框架。
2.directshow是微軟的推出的windows平臺上的媒體框架
應用比較廣泛,像視訊監控上位機,也就是pc端,基本上都得用這個了。另外windows平臺的播放器,也基本遵行這個框架的一些概念空間。
xvid/x264兩個組織,都把自己的演算法庫給封裝了一套filter,方便相容到這個平臺上。
3.openmax
層次比較gstreamer與directshow低一些,主要用來封裝解碼庫,基本的概念空間也是元件,不過通訊方式叫什麼tunels(隧道)
典型應用就是android手機平臺了,呵呵。(好牛b啊)
對這些框架來說,都是為了方便開發應用準備的,與第一個層次區別就是,第一個層次就是一個單純的應用,而這個層次,只是提供了一些機制,你可以用這些機制做任何你想要的東西
另外覺得這些開源的傢伙太能搗騰了,基本類似的概念空間組合來組合去。讓我們這些小菜學得學得頭大。
三.庫
首先要明確的是,庫與框架的區別。
一般來說,框架只用寫一些回撥函式,應用就能跑起來,類似於mfc的button響應,android的oncreate之流。
庫,只是一些功能,你需要自己呼叫起這些功能。
(一個簡單的區別方法是,你用不用自己寫main函式,呵呵,相當不科學,不過一般是準確的)
好吧,我覺得我也沒說清,呵呵。
ffmpeg/ffshow基本屬於這個概念層次的。
ffmpeg是上面介紹的東西的老祖宗,軟體/框架,都是依賴這個庫來實做的,ffmpeg提供了萬能解複用,解碼功能,他們只是呼叫這個庫,進行自己需要的封裝。
ffshow與ffmpeg的關係更曖昧。對directshow的filter概念空間來說,很多filter要自己寫,所以有人就站出來做了這事,開源了,ffshow就是這樣的東西。
一句話,用ffmpeg與了一堆filter.