?

基于DirectShow技術的媒體播放器

2008-07-14 10:05秦曉梅張藝博
電腦知識與技術 2008年18期

秦曉梅 張藝博

摘要:介紹了DirectShow技術的基本概念和Filter Graph及其組成,提出了一個基于DirectShow技術的媒體播放器的設計,并構建了過濾器圖表,同時文中詳細敘述了軟件開發的實現框架。本文以VC + + 6.0和DirectShow技術開發媒體播放器,并給出了關鍵代碼的示例。

關鍵詞: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軟件開發包是微軟公司提供的一套在Windows平臺上開發高性能圖形、聲音、輸入輸出和網絡游戲的編程接口,DirectShow是DirectX家族的成員之一,DirectShow可以實現高質量的音視頻采集、編輯、編碼、解碼和播放。DirectShow是基于COM 的,它為程序人員從Windows平臺上音視頻信息的網絡傳輸、硬件差異、同步性中解脫出來,軟件開發者只要按照DirectShow COM接口來編寫程序,不用關心硬件設備、不同媒體格式的差別、編解碼的實現細節等,極大地降低了多媒體應用程序開發的復雜度,目前DirectShow在多媒體應用中發揮著重要作用。

2 DirectShow概述

DirectShow是一個開放的應用框架,是一套基于COM的編程接口。圖 1是DirectShow的系統功能。圖中最大的一塊就是DireceShow系統,它的基本工作原理就是流水線:將Filter串聯在一起,交由Filter Graph Manager統一管理。系統的輸入為文件、硬件板塊、網絡數據等,系統的輸出為聲卡、顯卡、本地文件系統、網絡。

圖1 DiretShow系統

3 Filter Graph及其組成

3.1 DirectShow的Filter

DirectShow是基于模塊化,每個功能模塊都采取COM組件方式,稱為Filter。DirectShow提供了一系列標準的模塊用于應用開發,開發者也可以開發自己的Filter來擴展DirectShow的應用。下面我們用一個例子來說明如何采取Filter來播放一個AVI的視頻文件。從文件讀取數據,形成字節流(這個工作由源Filter完成),檢查AVI數據流的頭格式,然后通過AVI分割Filter將音視頻流分開。根據壓縮格式的不同,選取不同的Decoder Filters解碼視頻流,重畫視頻圖像。通過Renderer Filter將音頻流送到聲卡進行播放,一般采用缺省的 DirectSound Device Filter。流程見下圖 2。

圖2 AVI文件播放流程

從圖 2看,每一個Filter 都和其他的一個或者兩個Filter 相連接,連接點也是COM對象,稱為Pin。Filter通過Pin將數據從一個Filter傳遞到另一個Filter,從而可以使數據在Filter的鏈表中流動。

3.2 Filter Graph Manager

Filter Graph Manager是一個COM對象,用來控制Filter Graph中的所有的Filter,主要有以下的功能:

(1)用來協調Filter之間的狀態改變,從而使Graph中的所有的Filter的狀態的改變應該一致。Graph中的Filter的狀態改變應該一致,應用程序并不將狀態改變的命令直接發給Filter,而是將相應的狀態改變的命令發送給Filter Graph Manager,由manager將命令分發給Graph中每一個Filter。

(2)建立一個參考時鐘。Graph中的Filter都采用同一個時鐘,稱為參考時鐘(reference clock),參考時鐘可以確保所有的數據流同步。Filter Graph Manager應該選擇一個參考時鐘,可以選擇聲卡上的時鐘,也可以選擇系統時鐘。

(3)將Filter的消息返回給應用程序。Graph管理器采用事件機制將Graph中發生的事件通知給應用程序,這個機制類似于windows消息循環機制。

(4)提供方法建立Filter Graph。Graph管理器給應用程序提供了將Filter添加進Graph的方法,連接Filter的方法,斷開Filter連接的方法。

3.3 媒體類型

DirectShow需要一種方式來描述Filter Graph每一個點的數據格式,例如,我們還以播放AVI文件為例,數據以RIFF塊的形式進入Graph中,然后被分割成視頻和音頻流,視頻流有一系列的壓縮的視頻幀組成,解壓后視頻流由一系列的無壓縮的位圖組成,音頻流也要走同樣的步驟。

3.4 硬件在Graph中的作用

為了提高系統的穩定性,Windows操作系統對硬件操作進行了隔離。DirectShow包裝Filter,這種Filter能工作在用戶模式下,外觀、控制方法跟普通Filter 一樣,而包裝Filter內部完成與硬件驅動程序的交互。使得編寫DirectShow應用程序從支持硬件而做出的特殊處理中解脫出來。

4 基于DirectShow技術的媒體播放器

4.1 配置開發環境

本媒體播放器(MyPlayer)使用VC++6.0開發,采用DirectX SDK9.0編程接口。DirectX SDK安裝在C: DX90SDK目錄下。軟件開發之前必須先完成以下準備工作。

(1)編譯基類源代碼,用VC打開C:DX90SDKSamplesC++DirectShow

BaseClassesaseclass.dsw,編譯生成兩個靜態庫文件:Debug版本生成strmbasd.lib,Release版本生成strmbase.lib。

(2)配置VC的編譯環境:Include目錄和Lib目錄分別添加以下內容:

C:DX90SDKINCLUDE

C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSES

C:DX90SDKSAMPLESC++COMMON

C:DX90SDKLIB

C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSESDebug

C:DX90SDKSAMPLESC++DIRECTSHOWBASECLASSESRelease

(3)配置DirectShow應用程序開發項目需要連接的庫文件。執行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應用程序。程序入口函數為WinMain,總的執行流程如下:CoInitializeEx|創建主窗口|發送消息彈出一個對話框以選擇要播放的媒體文件|主線程的消息循環|CoUninitialize。主線程的消息循環中完成:播放、暫停、停止、全屏、快放、慢放等。

(1)播放功能實現方法為:選擇媒體文件、初始化程序窗口、初始化視頻播放窗口、調用HRESULT PlayMovieInWindow(LPTSTR szFile)函數完成播放。PlayMovieInWindow函數主要實現代碼和功能如下:

1)創建一個Filter Graph組件CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGB);

2)智能連接構建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);

// 得到視頻相關接口

pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);

pGB->QueryInterface(IID_IBasicVideo, (void **)&pBV);

// 得到音頻相關接口

pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA);

//完成其他窗口的初始化

UpdateWindow(ghApp);

4)播放Filter Graph

pMC->Run();

5)更新當前狀態

g_psCurrent=Running;

SetFocus(ghApp);

(2)暫停和停止功能實現為pMC->Pause();pMC->Stop();

(3)全屏功能實現為pVW->put_FullScreenMode(OATRUE);

(4)快放和慢放pMP->put_Rate(dNewRate);

5 結束語

本文簡要介紹了DirectShow技術的基本概念和基于DirectShow技術的媒體播放器,并用VC++6.0實現。DirectShow提供的良好開發環境,使得媒體播放器開發實現比較方便,并且具有廣泛的通用性和可擴展性。

參考文獻:

[1]智慧的魚.DirectShow SDK學習筆記[EB/OL].http://www.chinavideo.org.

[2]陸其明.DirectShow發指南[M].北京:清華大學出版社,2004.

[3]陸其明.DirectShow實務精選[M].北京:科海電子出版社,2004.

收稿日期:2008-04-02

作者簡介:秦曉梅(1980-),女,河南鄭州人,助教,華中科技大學在讀碩士,研究方向:數據庫技術、多媒體技術、軟件工程;張藝博(1973-),男,河南三門峽人,講師,華中科技大學碩士,研究方向:計算機信息安全,軟件工程和程序設計方向。

91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合