1. 程式人生 > >解碼庫區別 一些應該學習的開源框架與庫用途和差別

解碼庫區別 一些應該學習的開源框架與庫用途和差別

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.