程式者的胡言亂語

pageicon 星期三 八月 20, 2008

ffqlay – 基於ffmpeg、用於Windows的視訊音訊撥放程式庫

倘若要在Windows平台上開發視訊或音訊的應用程式,大多開發者的選擇都應該會是DirectShowDirectShow是微軟官方針對此種應用所制定的一套架構。倘若從架構的角度來看,我個人認為它是一套不錯的架構,而且相當的元件化,透過標準化的filter介面,應用程式可以彈性的進行組裝,並且變化出自己所需要的撥放方式。 不過,在處理多媒體的撥放時,除了一個好的撥放架構外,我們還會需要各式各樣的codec,以供所需的視訊、音訊編解碼之用(當然,你還會需要muxer以及demuxer)。這個部份對於在Windows上的開發者來說是個不小的問題。Windows作業系統有內建少數幾種視訊及音訊格式的codec,例如WMVWMA,但是倘若你的需求超出這內建的codec範圍,例如H.264,那麼除了購買codec開發商所開發的codec,尋求開放原始碼的codec就成了絕大多數開發者會採取的選擇

事實上,自行開發codec並不在應用程式開發者的責任範圍內,codec的開發已經是一份相當專業的工作,甚至許多公司的主要產品就是codec

在開放原始碼的codec中,ffmpeg中所含的codecs無疑的是最受歡迎的其中之一組。ffmpeg本身主要的作用在於影音檔案的轉換,不過其中所含的各種videoaudiocodecs,其類型之多十分少見。同時,投入ffmpeg的開發力量也很強大,codec的增加和改善都有讓人滿意的狀態。許多線上影音的分享網站,背後都採用ffmpeg做為轉換的工具。

從之前的兩篇部落格文「包裝ffmpeg中的codecs成為DirectShow中的transform filter」以及「包裝ffmpeg中的MP3 codecs成為DirectShow中的MP3 Decoder」,就可以看的出來,我試著想要善用ffmpeg中的資源,以融入DirectShow架構的企圖中。

有一陣子,我想要包裝ffmpeg中的codecs,成為一個通用的decoder。也就是說,將ffmpeg中的codecs包裝成為單一filter,將它放到DirectShow中,便可以解所有ffmpeg所支援的codec。在現有的開放原始碼的專案中,ffdshow便是和我想做的事情一樣的產物。ffdshow中含有兩個通用性質的video decoder以及audio decoder,分別用來解各種格式的videoaudio資訊,而且它們都是DirectShow架構下的filterffdshow提供的是一體適用的decoder,因此使用ffdshow的應用程式,因為codec而產生的困擾就會小的多了。儘管ffdshow十分強大,但是很可惜的,它的版權是GPL,是許多情況下我個人比較不偏好的一種。 礙於這一陣子的忙碌,基於LGPLffmpeg來打造通用性質decoder的這件工作,始終一直沒有時間著手。之後發生了一些事情,讓我生起來了想要放棄DirectShow架構來進行撥放的念頭。我想到,ffmpeg專案中有一個ffplay程式,是個基於 SDLSimple DirectMedia Library)的撥放程式,它可以撥放ffmpeglibavcodec這個程式庫中所含codec之格式的檔案。於是,我將這個想法轉變成為直接基於ffplay來做為撥放架構的基礎,如此一來,便能在不倚賴DirectShow的情況下,直接撥放ffmpeg所支援的所有類型檔案。

這個部落格有幾篇文提到了「開放原始碼的回收與再利用」的想法,而這一次的想法與做法,也完全不脫這樣子的思維方式。


如果我們需要一張椅子,我們可能會先找到「一張既有的木頭茶几,然後將這張茶几重新修整,並且添加新的材料,而成為一張具有新面貌的椅子」。何況,ffplay本身就是一張十分符合我需求的椅子了,不過少了扶手罷了。所以,我要做的只是為它加上扶手。 我需要的不是一個像ffplay這樣子可獨立執行的程式,我需要的其實是一個程式庫,提供一組API,使得我可以輕易的利用這組API,為我的應用程式加上撥放的功能。所以我花了些許的時間,對ffplay做極小幅度的修改(事實上,我甚至沒有閱讀ffplay絕大多數的程式碼),將其中的功能包裝成為一組API。我把這程式庫版本的ffplay稱為ffqlay(把”p”左右反轉成為”q”,希望這樣子沒有違反開放原始碼社群的什麼慣例)。修改後的ffqlay,自然也是LGPL利用Mingw32可以編譯ffmpeg整個專案以及ffqlay。我為ffqlay撰寫了一個ffqlayDemo的專案,藉以示範說明ffqlay中的APIffqlayDemoC#撰寫的,透過它你可以明白應用程式的開發者可以如何輕易的以十分簡短的程式碼,便能達成撥放的種種功能。 以下,便是ffqlayDemo撥放一個VOB檔案的畫面,事實上,它可以撥放任何你所build出來ffmpeg中所支援的格式,所以我把之前下載的 FLV Player都砍掉了。即使拿來撥放不含video streamMP3音樂檔案,也完全沒有問題。


接下來我會利用空閒時間,說明一下ffqlay中的API。有興趣的讀者,不妨更關心本部落格的動態。




 


程式的下載可先於以下網址下載,我希望可以長期持續維護,因此我會尋找一個更適合的方式來分享相關的資源。

ffqlay.c下載 ffqlayDemo下載

想用使用上述的程式,你或許需要自行能夠編譯ffmpeg以及把ffqlay加至ffmpeg中編譯。我希望有空可以再解釋,不過如果有讀者遇上了麻煩,就要請你留言了,我會試著盡我可能的協助。

迴響:

Thanks your Blog

由...發表 Jack on 八月 22, 2008 at 02:21 下午 CST #

how to reduce avcodec.dll size?

由...發表 60.251.76.100 on 四月 10, 2009 at 11:38 上午 CST #

發表迴響:
  • HTML 語法: 關閉
把對母乳媽媽的感謝與支持傳出去

« 九月 2010
星期日星期一星期二星期三星期四星期五星期六
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  
       
今日

Search this blog

Links

Weblog menu

Today's referrers

Feeds