Windows Media媒體內(nèi)容采用的是ASF文件格式。Microsoft公司提供了Windows Media Format SDK,以支持以下三大功能:ASF文件的生成(包括ASF數(shù)據(jù)的流化)、ASF文件的編輯和ASF文件的播放(包括ASF媒體流的播放)。在開始編程之前,對SDK系統(tǒng)有個總體的認(rèn)識和理解是必要的。(注:如果未作特別說明,本書所述的SDK或WMF SDK均是指Windows Media Format SDK。)
WMF SDK采用了面向?qū)ο蟮脑O(shè)計,是一套完全基于COM組件模型的高級開發(fā)包。這里說高級,意味著SDK屏蔽了ASF數(shù)據(jù)格式、網(wǎng)絡(luò)傳輸控制等較為底層的流媒體技術(shù)實(shí)現(xiàn)細(xì)節(jié),留給開發(fā)者的只有比較上層的編程接口。

圖2.1 WMF SDK系統(tǒng)結(jié)構(gòu)
如圖2.1,SDK引入了一系列的對象,如生成器、讀取器、編輯器等。正是這些SDK對象屏蔽了Windows Media技術(shù)實(shí)現(xiàn)細(xì)節(jié),使得應(yīng)用程序開發(fā)者不需要了解太多的流媒體底層技術(shù),也能開發(fā)出非常專業(yè)的流媒體應(yīng)用系統(tǒng)。
在SDK引入的眾多對象中,最重要的莫過于圖2.1中列出的那三個了。其中,生成器一般用于將非壓縮的媒體數(shù)據(jù)編碼成Windows Media格式的數(shù)據(jù)。整個編碼過程非常簡單,只要通過一個叫Profile的對象配置好目標(biāo)數(shù)據(jù)流格式,再將輸入數(shù)據(jù)的格式告訴生成器,然后依次將輸入數(shù)據(jù)按照既定的方式傳給生成器,剩下的事就都可以交給生成器了。生成器內(nèi)部會根據(jù)Profile的配置,自動選擇一種Windows Media編碼器,然后對輸入數(shù)據(jù)進(jìn)行壓縮編碼,并且完成打包,最終寫成文件或者向網(wǎng)絡(luò)流化。

圖2.2 生成器的工作流程
如圖2.2是生成器大致的工作流程。可以看到,生成器內(nèi)部對輸入數(shù)據(jù)可能有一個預(yù)處理過程。因?yàn)樘囟ň幋a器能夠接受的數(shù)據(jù)格式總是有限的。如果輸入數(shù)據(jù)格式不能被編碼器接受,生成器內(nèi)部會自動進(jìn)行一個預(yù)處理過程。這些預(yù)處理工作包括視頻的圖像大小縮放、幀率調(diào)整、色彩空間轉(zhuǎn)換、水印疊加,音頻的采樣頻率轉(zhuǎn)換等等。另外,生成器本身不負(fù)責(zé)編碼后的數(shù)據(jù)的最終去向,而是把這個任務(wù)交給了一種叫接收器(Sink)的對象,比如交給文件接收器就可以將數(shù)據(jù)保存為文件,交給網(wǎng)絡(luò)接收器就可以將數(shù)據(jù)進(jìn)行廣播,交給推接收器就可以將數(shù)據(jù)分發(fā)到運(yùn)行Windows Media Services的服務(wù)器上等等。SDK采用這種“生成器 + 接收器”的設(shè)計是很先進(jìn)的,它保證了SDK系統(tǒng)具有很強(qiáng)的擴(kuò)展性。比如我們可以開發(fā)自己的接收器,按我們的要求決定壓縮數(shù)據(jù)的最終去向。
如果你用過Microsoft公司官方發(fā)布的Windows Media內(nèi)容的編碼軟件Windows Media Encoder的話,不要懷疑,通過WMF SDK的學(xué)習(xí),你也可以開發(fā)出一個類似的編碼軟件。
WMF SDK有兩個讀取器:異步讀取器和同步讀取器。兩個讀取器的功能類似,都是用于讀取ASF數(shù)據(jù),不同的是它們的工作方式:異步讀取器內(nèi)部自帶一個線程來把數(shù)據(jù)流推給應(yīng)用程序;而同步讀取器內(nèi)部沒有驅(qū)動數(shù)據(jù)流的線程,應(yīng)用程序直接(在應(yīng)用程序的線程中)通過同步讀取器上的接口函數(shù)來獲取數(shù)據(jù)。(注:異步讀取器通常簡稱為讀取器,而只在與同步讀取器對比時才強(qiáng)調(diào)“異步”特性。)

圖2.3 讀取器的工作流程
默認(rèn)情況下,讀取器輸出一種非壓縮格式的數(shù)據(jù)。也就是說,讀取器內(nèi)部會自動選擇合適的解碼器對ASF流數(shù)據(jù)進(jìn)行解壓縮,如圖2.3。當(dāng)然,通過適當(dāng)?shù)脑O(shè)置,讀取器也可以輸出ASF流數(shù)據(jù)原有的壓縮格式。
值得注意的是,異步讀取器在各個版本的SDK中都能使用;而同步讀取器是在9系列的SDK中才開始有的。之所以增加同步讀取器,是因?yàn)閿?shù)據(jù)的同步讀取模式在一些特殊的場合下較有優(yōu)勢,比如在一些進(jìn)行內(nèi)容編輯的應(yīng)用程序中,使用同步讀取器可以快速讀取指定位置的一部分?jǐn)?shù)據(jù)。另外,同步讀取器通過直接的接口函數(shù)調(diào)用來提供數(shù)據(jù),使用起來也比較簡單。當(dāng)然,同步讀取器也有明顯的不足,比如不支持讀取網(wǎng)絡(luò)文件,不支持DRM(數(shù)字版權(quán)管理)等等。因此,在絕大多數(shù)ASF文件讀取的場合下還是使用異步讀取器。
最后來簡單介紹一下編輯器。說是編輯器,大家不要誤會它能做媒體內(nèi)容的修改。其實(shí)它只能編輯一些元數(shù)據(jù)。所謂元數(shù)據(jù),就是這個媒體內(nèi)容的標(biāo)題、描述、作者、版權(quán)等信息。