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