秦曉梅 張藝博
摘要:介紹了DirectShow技術(shù)的基本概念和Filter Graph及其組成,提出了一個(gè)基于DirectShow技術(shù)的媒體播放器的設(shè)計(jì),并構(gòu)建了過(guò)濾器圖表,同時(shí)文中詳細(xì)敘述了軟件開(kāi)發(fā)的實(shí)現(xiàn)框架。本文以VC + + 6.0和DirectShow技術(shù)開(kāi)發(fā)媒體播放器,并給出了關(guān)鍵代碼的示例。
關(guān)鍵詞:DirecShow;Filter;Filter Graph;媒體播放器
中圖分類號(hào):TP37文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)18-2pppp-0c
Media Player Based on DirectShow Technology
QIN Xiao-mei, ZHANG Yi-bo
(Henan Economy and Trade Vocational College,Zhenzhou 450053,China)
Abstract: This thesis mainly introduces the basic concept of DirectShow technology, and Filter Graph with its composition, the thesis suggests a media player based on DirectShow technology one, and designs filter graph. The realization frame of software development is discussed at the same time detailedly in the main body of this thesis. VC + + 6.0 and DirectShow technology is used in the course of programming. the key code of the program is also available.
Key words:DirecShow;Filter;Filter Graph;Media Player
1 引言
DirectX軟件開(kāi)發(fā)包是微軟公司提供的一套在Windows平臺(tái)上開(kāi)發(fā)高性能圖形、聲音、輸入輸出和網(wǎng)絡(luò)游戲的編程接口,DirectShow是DirectX家族的成員之一,DirectShow可以實(shí)現(xiàn)高質(zhì)量的音視頻采集、編輯、編碼、解碼和播放。DirectShow是基于COM 的,它為程序人員從Windows平臺(tái)上音視頻信息的網(wǎng)絡(luò)傳輸、硬件差異、同步性中解脫出來(lái),軟件開(kāi)發(fā)者只要按照DirectShow COM接口來(lái)編寫程序,不用關(guān)心硬件設(shè)備、不同媒體格式的差別、編解碼的實(shí)現(xiàn)細(xì)節(jié)等,極大地降低了多媒體應(yīng)用程序開(kāi)發(fā)的復(fù)雜度,目前DirectShow在多媒體應(yīng)用中發(fā)揮著重要作用。
2 DirectShow概述
DirectShow是一個(gè)開(kāi)放的應(yīng)用框架,是一套基于COM的編程接口。圖 1是DirectShow的系統(tǒng)功能。圖中最大的一塊就是DireceShow系統(tǒng),它的基本工作原理就是流水線:將Filter串聯(lián)在一起,交由Filter Graph Manager統(tǒng)一管理。系統(tǒng)的輸入為文件、硬件板塊、網(wǎng)絡(luò)數(shù)據(jù)等,系統(tǒng)的輸出為聲卡、顯卡、本地文件系統(tǒng)、網(wǎng)絡(luò)。
圖1 DiretShow系統(tǒng)
3 Filter Graph及其組成
3.1 DirectShow的Filter
DirectShow是基于模塊化,每個(gè)功能模塊都采取COM組件方式,稱為Filter。DirectShow提供了一系列標(biāo)準(zhǔn)的模塊用于應(yīng)用開(kāi)發(fā),開(kāi)發(fā)者也可以開(kāi)發(fā)自己的Filter來(lái)擴(kuò)展DirectShow的應(yīng)用。下面我們用一個(gè)例子來(lái)說(shuō)明如何采取Filter來(lái)播放一個(gè)AVI的視頻文件。從文件讀取數(shù)據(jù),形成字節(jié)流(這個(gè)工作由源Filter完成),檢查AVI數(shù)據(jù)流的頭格式,然后通過(guò)AVI分割Filter將音視頻流分開(kāi)。根據(jù)壓縮格式的不同,選取不同的Decoder Filters解碼視頻流,重畫視頻圖像。通過(guò)Renderer Filter將音頻流送到聲卡進(jìn)行播放,一般采用缺省的 DirectSound Device Filter。流程見(jiàn)下圖 2。
圖2 AVI文件播放流程
從圖 2看,每一個(gè)Filter 都和其他的一個(gè)或者兩個(gè)Filter 相連接,連接點(diǎn)也是COM對(duì)象,稱為Pin。Filter通過(guò)Pin將數(shù)據(jù)從一個(gè)Filter傳遞到另一個(gè)Filter,從而可以使數(shù)據(jù)在Filter的鏈表中流動(dòng)。
3.2 Filter Graph Manager
Filter Graph Manager是一個(gè)COM對(duì)象,用來(lái)控制Filter Graph中的所有的Filter,主要有以下的功能:
(1)用來(lái)協(xié)調(diào)Filter之間的狀態(tài)改變,從而使Graph中的所有的Filter的狀態(tài)的改變應(yīng)該一致。Graph中的Filter的狀態(tài)改變應(yīng)該一致,應(yīng)用程序并不將狀態(tài)改變的命令直接發(fā)給Filter,而是將相應(yīng)的狀態(tài)改變的命令發(fā)送給Filter Graph Manager,由manager將命令分發(fā)給Graph中每一個(gè)Filter。
(2)建立一個(gè)參考時(shí)鐘。Graph中的Filter都采用同一個(gè)時(shí)鐘,稱為參考時(shí)鐘(reference clock),參考時(shí)鐘可以確保所有的數(shù)據(jù)流同步。Filter Graph Manager應(yīng)該選擇一個(gè)參考時(shí)鐘,可以選擇聲卡上的時(shí)鐘,也可以選擇系統(tǒng)時(shí)鐘。
(3)將Filter的消息返回給應(yīng)用程序。Graph管理器采用事件機(jī)制將Graph中發(fā)生的事件通知給應(yīng)用程序,這個(gè)機(jī)制類似于windows消息循環(huán)機(jī)制。
(4)提供方法建立Filter Graph。Graph管理器給應(yīng)用程序提供了將Filter添加進(jìn)Graph的方法,連接Filter的方法,斷開(kāi)Filter連接的方法。
3.3 媒體類型
DirectShow需要一種方式來(lái)描述Filter Graph每一個(gè)點(diǎn)的數(shù)據(jù)格式,例如,我們還以播放AVI文件為例,數(shù)據(jù)以RIFF塊的形式進(jìn)入Graph中,然后被分割成視頻和音頻流,視頻流有一系列的壓縮的視頻幀組成,解壓后視頻流由一系列的無(wú)壓縮的位圖組成,音頻流也要走同樣的步驟。
3.4 硬件在Graph中的作用
為了提高系統(tǒng)的穩(wěn)定性,Windows操作系統(tǒng)對(duì)硬件操作進(jìn)行了隔離。DirectShow包裝Filter,這種Filter能工作在用戶模式下,外觀、控制方法跟普通Filter 一樣,而包裝Filter內(nèi)部完成與硬件驅(qū)動(dòng)程序的交互。使得編寫DirectShow應(yīng)用程序從支持硬件而做出的特殊處理中解脫出來(lái)。
4 基于DirectShow技術(shù)的媒體播放器
4.1 配置開(kāi)發(fā)環(huán)境
本媒體播放器(MyPlayer)使用VC++6.0開(kāi)發(fā),采用DirectX SDK9.0編程接口。DirectX SDK安裝在C: DX90SDK目錄下。軟件開(kāi)發(fā)之前必須先完成以下準(zhǔn)備工作。
(1)編譯基類源代碼,用VC打開(kāi)C:DX90SDKSamplesC++DirectShow
BaseClassesaseclass.dsw,編譯生成兩個(gè)靜態(tài)庫(kù)文件:Debug版本生成strmbasd.lib,Release版本生成strmbase.lib。
(2)配置VC的編譯環(huán)境:Include目錄和Lib目錄分別添加以下內(nèi)容:
C:DX90SDKINCLUDE
C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSES
C:DX90SDKSAMPLESC++COMMON
C:DX90SDKLIB
C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSESDebug
C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSESRelease
(3)配置DirectShow應(yīng)用程序開(kāi)發(fā)項(xiàng)目需要連接的庫(kù)文件。執(zhí)行VC的菜單命令Project|Setttings,在彈出的對(duì)話框中單擊Link標(biāo)簽,在Object/library modules文本框中,Debug版本輸入strmbasd.lib Winmm.lib,Release版本輸入strmbase.lib Winmm.lib。
4.2 功能設(shè)計(jì)
主要功能包括:播放、暫停、停止、快放、慢放、全屏播放。MyPlayer是在C:DX90SDKSamplesC++DirectShowPlayerPlayWnd基礎(chǔ)上修改完成的。程序界面如圖 3。
圖3 程序界面
MyPlayer是一個(gè)標(biāo)準(zhǔn)的Win32應(yīng)用程序。程序入口函數(shù)為WinMain,總的執(zhí)行流程如下:CoInitializeEx|創(chuàng)建主窗口|發(fā)送消息彈出一個(gè)對(duì)話框以選擇要播放的媒體文件|主線程的消息循環(huán)|CoUninitialize。主線程的消息循環(huán)中完成:播放、暫停、停止、全屏、快放、慢放等。
(1)播放功能實(shí)現(xiàn)方法為:選擇媒體文件、初始化程序窗口、初始化視頻播放窗口、調(diào)用HRESULT PlayMovieInWindow(LPTSTR szFile)函數(shù)完成播放。PlayMovieInWindow函數(shù)主要實(shí)現(xiàn)代碼和功能如下:
1)創(chuàng)建一個(gè)Filter Graph組件CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB);
2)智能連接構(gòu)建Filter Graph組件pGB->RenderFile(wFile, NULL);
3)獲取Filter Graph的各個(gè)控制接口
//得到播放器控制接口、定位接口等
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
pGB->QueryInterface(IID_IMediaEventEx, (void **)&pME);
pGB->QueryInterface(IID_IMediaSeeking, (void **)&pMS);
pGB->QueryInterface(IID_IMediaPosition, (void **)&pMP);
// 得到視頻相關(guān)接口
pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);
pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV);
// 得到音頻相關(guān)接口
pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA);
//完成其他窗口的初始化
UpdateWindow(ghApp);
4)播放Filter Graph
pMC->Run();
5)更新當(dāng)前狀態(tài)
g_psCurrent=Running;
SetFocus(ghApp);
(2)暫停和停止功能實(shí)現(xiàn)為pMC->Pause();pMC->Stop();
(3)全屏功能實(shí)現(xiàn)為pVW->put_FullScreenMode(OATRUE);
(4)快放和慢放pMP->put_Rate(dNewRate);
5 結(jié)束語(yǔ)
本文簡(jiǎn)要介紹了DirectShow技術(shù)的基本概念和基于DirectShow技術(shù)的媒體播放器,并用VC++6.0實(shí)現(xiàn)。DirectShow提供的良好開(kāi)發(fā)環(huán)境,使得媒體播放器開(kāi)發(fā)實(shí)現(xiàn)比較方便,并且具有廣泛的通用性和可擴(kuò)展性。
參考文獻(xiàn):
[1]智慧的魚.DirectShow SDK學(xué)習(xí)筆記[EB/OL].http://www.chinavideo.org.
[2]陸其明.DirectShow發(fā)指南[M].北京:清華大學(xué)出版社,2004.
[3]陸其明.DirectShow實(shí)務(wù)精選[M].北京:科海電子出版社,2004.
收稿日期:2008-04-02
作者簡(jiǎn)介:秦曉梅(1980-),女,河南鄭州人,助教,華中科技大學(xué)在讀碩士,研究方向:數(shù)據(jù)庫(kù)技術(shù)、多媒體技術(shù)、軟件工程;張藝博(1973-),男,河南三門峽人,講師,華中科技大學(xué)碩士,研究方向:計(jì)算機(jī)信息安全,軟件工程和程序設(shè)計(jì)方向。