青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-22  文章-0  trackbacks-0

1 DirectX簡介

  DirectXMicrosoft公司為游戲和其他高性能多媒體應(yīng)用所提供的一套底層應(yīng)用程序編程接口。這些接口包括對二維和三維圖形,聲效和音樂,輸入設(shè)備以及多玩家網(wǎng)絡(luò)游戲等的支持。本文以DirectX 9.0為例進(jìn)行介紹

  1.1 DirectX的組成

  DirectX 9.0由下列組件構(gòu)成:

 ?。?/span>1DirectX Graphics:該組件組合DirectX舊版本中的DirectDrawDirect3D兩個組件,使其成為一個適用于所有圖形程序的單獨的應(yīng)用程序接口。其中的Direct3D擴(kuò)展(D3DX)應(yīng)用程序庫簡化了多數(shù)圖形程序的工作。

  (2DirectInput:支持各種輸入設(shè)備,完全支持力反饋技術(shù)。

 ?。?/span>3DirectPlay:支持多玩家網(wǎng)絡(luò)游戲。

 ?。?/span>4DirectSound:支持用于播放和捕獲音頻波形的高性能音頻應(yīng)用軟件的開發(fā)。

  (5DirectMusic:為音樂音軌以及基于波表、MIDIMusical Instrument Devices Interface)或其他由DirectMusic Producer創(chuàng)作的非音樂音軌,提供了一套完整的解決方案。

 ?。?/span>6DirectShow:提供對多媒體數(shù)據(jù)流的高質(zhì)量捕獲和回放。

  (7DirectSetup:一個簡單的應(yīng)用程序接口,提供DirectX組件的自動安裝。

 ?。?/span>8DirectX Media Objects:提供對數(shù)據(jù)流對象的讀寫支持,包括視頻和音頻的編解碼器及其效果。

  1.2 COM簡介

  DirectX的功能都是以COM組件的形式提供的。COM是組件對象模型(Component Object Model)的簡寫,它是一種協(xié)議,是對象連接和嵌入(Object Linking and Embedding)的基礎(chǔ)。COM通常以動態(tài)鏈接庫(DLL)的形式存在,它是建立在二進(jìn)制規(guī)范上的對象。COM定義并實現(xiàn)了軟部件(如應(yīng)用程序、數(shù)據(jù)對象、控件及服務(wù))機(jī)制,并把他們統(tǒng)稱為"對象"。每個軟部件對象由數(shù)據(jù)以及訪問數(shù)據(jù)的函數(shù)組成,訪問軟部件對象數(shù)據(jù)的函數(shù)集合稱為"接口"。在應(yīng)用程序看來COM是一個黑箱,可調(diào)用COM提供的方法但不知道它的具體實現(xiàn)。在使用DirectShow編程時,用戶創(chuàng)建的自定義組件必須以COM形式實現(xiàn),所以必須知道如何實現(xiàn)COM,而一般的應(yīng)用程序只需要了解COM的接口和用法就可以了。


2 DirectShow
的系統(tǒng)組成

  DirectShow技術(shù)是建立在DirectDrawDirectSound組件基礎(chǔ)之上的,它通過DirectDraw對顯卡進(jìn)行控制以顯示視頻,通過DirectSound對聲卡進(jìn)行控制以播放聲音。 DirectShow可提供高質(zhì)量的多媒體流的捕獲和回放功能;支持多種媒體格式,包括ASFAdvanced Systems Format),MPEGMotion Picture Experts Group),AVIAudio-Video Interleaved),MP3MPEG Audio Layer-3)和WAV聲音文件;可以從硬件上捕獲媒體數(shù)據(jù)流;可以自動檢測并使用視頻和音頻加速硬件。因此,DirectShow可以充分發(fā)揮媒體的性能,提高運(yùn)行速度,可以簡化媒體播放、媒體間的格式轉(zhuǎn)換和媒體捕獲等工作。同時,它還具有極大的可擴(kuò)展性和靈活性,可以由用戶自己創(chuàng)建組件,并將這個組件加入DirectShow結(jié)構(gòu)中以支持新的格式或特殊的效果。
應(yīng)用程序與DirectShow組件以及DirectShow所支持的軟硬件之間的關(guān)系如圖1所示。



 

                           
1 DirectShow系統(tǒng)框圖


  2.1 過濾器(filter

  由圖1可以看到,過濾器是DirectShow最基本的組成元件。過濾器是一個COM組件,是完成DirectShow處理過程的基本單元。DirectShow提供了一組標(biāo)準(zhǔn)的過濾器供應(yīng)用程序使用,程序開發(fā)者也可以創(chuàng)建自定義的過濾器來擴(kuò)充DirectShow的功能,但必須是以COM形式建立的。DirectX為用戶提供了DirectShow基類庫(DirectShow Base Class Library),用戶自定義的過濾器都可以從基類庫提供的基類和接口派生出來。
過濾器主要分為以下幾種類型:

 ?。?/span>1)源過濾器(source filter):源過濾器引入數(shù)據(jù)到過濾器圖表中,數(shù)據(jù)來源可以是文件、網(wǎng)絡(luò)、照相機(jī)等。不同的源過濾器處理不同類型的數(shù)據(jù)源。

 ?。?/span>2)變換過濾器(transform filter):變換過濾器的工作是獲取輸入流,處理數(shù)據(jù),并生成輸出流。變換過濾器對數(shù)據(jù)的處理包括編解碼、格式轉(zhuǎn)換、壓縮解壓縮等。

  (3)提交過濾器(renderer filter):提交過濾器在過濾器圖表里處于最后一級,它們接收數(shù)據(jù)并把數(shù)據(jù)提交給外設(shè)。

 ?。?/span>4)分割過濾器(splitter filter):分割過濾器把輸入流分割成多個輸出。例如,AVI分割過濾器把一個AVI格式的字節(jié)流分割成視頻流和音頻流。

 ?。?/span>5)混合過濾器(mux filter):混合過濾器把多個輸入組合成一個單獨的數(shù)據(jù)流。例如,AVI混合過濾器把視頻流和音頻流合成一個AVI格式的字節(jié)流。

  過濾器的這些分類并不是絕對的,例如一個ASF讀過濾器(ASF Reader filter)既是一個源過濾器又是一個分割過濾器。

  在DirectShow里,一組過濾器稱為一個過濾器圖表(filter graph)。過濾器圖表用來連接過濾器以控制媒體流,它也可以將數(shù)據(jù)返回給應(yīng)用程序,并搜索所支持的過濾器。過濾器有三種可能的狀態(tài):運(yùn)行、停止和暫停。暫停是一種中間狀態(tài),停止?fàn)顟B(tài)到運(yùn)行狀態(tài)必定經(jīng)過暫停狀態(tài)。暫??梢岳斫鉃閿?shù)據(jù)就緒狀態(tài),是為了快速切換到運(yùn)行狀態(tài)而設(shè)計的。在暫停狀態(tài)下,數(shù)據(jù)線程是啟動的,但被提交過濾器阻塞了。通常情況下,過濾器圖表中所有過濾器的狀態(tài)是一致的。

  2.2 引腳(pin

  過濾器可以和一個或多個過濾器相連,連接的接口也是COM形式的,稱為引腳。過濾器利用引腳在各個過濾器間傳輸數(shù)據(jù)。每個引腳都是從Ipin這個COM對象派生出來的。每個引腳都是過濾器的私有對象,過濾器可以動態(tài)的創(chuàng)建引腳,銷毀引腳,自由控制引腳的生存時間。引腳可以分為輸入引腳(Input pin)和輸出引腳(Output pin)兩種類型,兩個相連的引腳必須是不同種類的,即輸入引腳只能和輸出引腳相連,且連接的方向總是從輸出引腳指向輸入引腳。

  過濾器之間的連接(也就是引腳之間的連接),實際上是連接雙方媒體類型(Media Type)協(xié)商的過程。連接的大致過程為:如果調(diào)用連接函數(shù)時已經(jīng)指定了完整的媒體類型,則用這個媒體類型進(jìn)行連接,成功與否都結(jié)束連接過程;如果沒有指定或不完全指定了媒體類型,則進(jìn)入下面的枚舉過程--枚舉欲連接的輸入引腳上所有的媒體類型,逐一用這些媒體類型與輸出引腳進(jìn)行連接(如果連接函數(shù)提供了不完全媒體類型,則要先將每個枚舉出來的媒體類型與它進(jìn)行匹配檢查),如果輸出引腳也接受這種媒體類型,則引腳之間的連接宣告成功;如果所有輸入引腳上枚舉的媒體類型,輸出引腳都不支持,則枚舉輸出引腳上的所有媒體類型,并逐一用這些媒體類型與輸入引腳進(jìn)行連接,如果輸入引腳接受其中的一種媒體類型,則引腳之間的連接宣告成功;如果輸出引腳上的所有媒體類型,輸入引腳都不支持,則這兩個引腳之間的連接過程宣告失敗。過濾器與引腳連接如圖2所示。
 
  圖2 過濾器和引腳連接示意圖


  2.3 媒體類型(Media Type

  媒體類型是描述數(shù)字媒體格式的一種通用的可擴(kuò)展方式。兩個過濾器相連時,必須使用一致的媒體類型,否則這兩個過濾器就不能相連。媒體類型能識別上一級過濾器傳送給下一級過濾器的數(shù)據(jù)類型,并對數(shù)據(jù)進(jìn)行分類。

  實際在很多應(yīng)用程序中,用戶根本不需要擔(dān)心媒體類型的問題,DirectShow會處理好所有的細(xì)節(jié)。但有些應(yīng)用程序需要對媒體類型進(jìn)行操作。媒體類型一般可以有兩種表示:AM_MEDIA_TYPECMediaType。前者是一個結(jié)構(gòu),后者是從這個結(jié)構(gòu)繼承過來的類。


  每個AM_MEDIA_TYPE由三部分組成:Major type、SubtypeFormat type。這三個部分都使用GUID(全局唯一標(biāo)識符)來唯一標(biāo)示。Major type主要定性描述一種媒體類型,這種媒體類型可以是視頻、音頻、比特數(shù)據(jù)流或MIDI數(shù)據(jù)等等;Subtype進(jìn)一步細(xì)化媒體類型,如果是視頻的話可以進(jìn)一步指定是RGB-24,還是RGB-32,或是UYVY等等;Format type則用一個結(jié)構(gòu)更進(jìn)一步細(xì)化媒體類型。

  如果媒體類型的三個部分都指定了某個具體的GUID值,則稱這個媒體類型是完全指定的;如果媒體類型的三個部分中有任何一個值是GUID_NULL,則稱這個媒體類型是不完全指定的。GUID_NULL具有通配符的作用。


  2.4 過濾器圖表管理器(Filter Graph Manager

  DirectShow通過過濾器圖表管理器來控制過濾器圖表中的過濾器。過濾器圖表管理器是COM 形式的,它的功能有:協(xié)調(diào)過濾器間的狀態(tài)轉(zhuǎn)變;建立參考時鐘;把事件(event)傳送給應(yīng)用程序;為應(yīng)用程序提供建立過濾器圖表的方法。

  一些常用的過濾器圖表管理器接口如下:

   IGraphBuilder:為應(yīng)用程序提供創(chuàng)建過濾器圖表的方法。

   IMediaControl:提供控制過濾器圖表中多媒體數(shù)據(jù)流的方法,包括運(yùn)行、暫停和停止。IMediaEventEx:繼承自IMediaEvent接口,處理過濾器圖表的事件。

   IVideoWindow:用于設(shè)置多媒體播放器窗口的屬性,應(yīng)用程序可以用它來設(shè)置窗口的所有者、位置和尺寸等屬性。

   IBasicAudio:用于控制音頻流的音量和平衡。

   IBasicVideo:用于設(shè)置視頻特性,如視頻顯示的目的區(qū)域和源區(qū)域。

   IMediaSeeking:提供搜索數(shù)據(jù)流位置和設(shè)置播放速率的方法。

   IMediaPosition:用于尋找數(shù)據(jù)流的位置。

   IVideoFrameStep:用于步進(jìn)播放視頻流,可使DirectShow應(yīng)用程序,包括DVD播放器一次只播放一幀視頻。

  2.5 過濾器圖表中的數(shù)據(jù)流動

  當(dāng)用戶要創(chuàng)建自定義的過濾器時,就需要了解媒體數(shù)據(jù)是如何在過濾器圖表中傳輸?shù)?。為了在過濾器圖表中傳送媒體數(shù)據(jù),DirectShow過濾器需要支持一些協(xié)議,稱之為傳輸協(xié)議(transport)。相連的過濾器必須支持同樣的傳輸協(xié)議,否則不能交換媒體數(shù)據(jù)。

  大多數(shù)的DirectShow過濾器把媒體數(shù)據(jù)保存在主存儲器中,并通過引腳把數(shù)據(jù)提交給其它的過濾器,這種傳輸稱為局部存儲器傳輸(local memory transport)。雖然局部存儲器傳輸在DirectShow中最常用,但并不是所有的過濾器都使用它。例如,有些過濾器通過硬件傳送媒體數(shù)據(jù),引腳只是用來提交控制信息,如IOverlay接口。

  DirectShow為局部存儲器傳輸定義了兩種機(jī)制:推模式(push model)和拉模式(pull model)。在推模式中,源過濾器生成數(shù)據(jù)并提交給下一級過濾器。下一級過濾器被動的接收數(shù)據(jù),完成處理后再傳送給再下一級過濾器。在拉模式中,源過濾器與一個分析過濾器相連。分析過濾器向源過濾器請求數(shù)據(jù)后,源過濾器才傳送數(shù)據(jù)以響應(yīng)請求。推模式使用的是IMemInputPin接口,拉模式使用IAsyncReader接口,推模式比拉模式要更常用。

3 利用DirectShow開發(fā)簡單媒體播放器

  本節(jié)介紹基于DirectShow開發(fā)簡單媒體播放器的關(guān)鍵步驟。

  3.1 初始化DirectShow

  由于DirectShow的組件都是以COM形式存在的,因此首先要調(diào)用CoInitializeEx函數(shù)來初始化COM庫,嵌入所有的動態(tài)鏈接庫和資源。否則,所有對QueryInterface的調(diào)用都會失敗。

  3.2 創(chuàng)建過濾器圖表管理器接口

  首先申明并初始化所需的接口:

// DirectShow interfaces
IGraphBuilder *pGB = NULL;
IMediaControl 
*pMC = NULL;
IMediaEventEx 
*pME = NULL;
IVideoWindow 
*pVW = NULL;
IBasicAudio 
*pBA = NULL;
IBasicVideo 
*pBV = NULL;
IMediaSeeking 
*pMS = NULL;
IMediaPosition 
*pMP = NULL;
IVideoFrameStep 
*pFS = NULL; 


  然后實例化一個過濾器圖表管理器,并查詢各接口:

// Get the interface for DirectShow's GraphBuilder
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
IID_IGraphBuilder, (
void **)&pGB);
// QueryInterface for DirectShow interfaces
pGB->QueryInterface(IID_IMediaControl, (void **)&pMC);
pGB
->QueryInterface(IID_IMediaEventEx, (void **)&pME);
pGB
->QueryInterface(IID_IMediaSeeking, (void **)&pMS);
pGB
->QueryInterface(IID_IMediaPosition, (void **)&pMP);
// Query for video interfaces, which may not be relevant for audio files
pGB->QueryInterface(IID_IVideoWindow, (void **)&pVW);
pGB
->QueryInterface(IID_IBasicVideo, (void **)&pBV);
// Query for audio interfaces, which may not be relevant for video-only files
pGB->QueryInterface(IID_IBasicAudio, (void **)&pBA);
 


  3.3 創(chuàng)建過濾器圖表

  應(yīng)用DirectShow創(chuàng)建過濾器圖表時,用戶完全不需要操心系統(tǒng)使用了哪一類過濾器以及過濾器是怎樣連接的。只要調(diào)用IGraphBuilder::RenderFile函數(shù),就可以建成一個完整的過濾器圖表。

// Have the graph builder construct its the appropriate graph automatically
pGB->RenderFile(wFile, NULL);
 


  創(chuàng)建成功后,過濾器圖表就可以用來播放多媒體文件了。DirectShow調(diào)用IMediaControl::Run函數(shù)來播放媒體文件。

// Run the graph to play the media file
pMC->Run();
 


  3.4 使用DirectShow的事件響應(yīng)機(jī)制

  DirectShow的事件響應(yīng)機(jī)制是過濾器圖表管理器與用戶進(jìn)行交互的接口,DirectShow處理的可以是一些事先可以預(yù)期的事件,比如數(shù)據(jù)流的結(jié)束;也可以是一些無法預(yù)期的錯誤。有的事件可以由過濾器圖表管理器自己處理,但如果過濾器圖表管理器自己無法處理這些事件,它就把事件的通知放在事件隊列里。用戶程序就可以通過IMediaEventEx接口得到事件,并對它做出相應(yīng)的處理。

  3.5 清除DirectShow

  在程序結(jié)束時必須調(diào)用Release函數(shù)釋放DirectShow的接口指針,并調(diào)用CoUninitialize函數(shù)來卸載COM庫,釋放所有的動態(tài)鏈接庫和資源。


4 結(jié)束語

  應(yīng)用DirectX的組件DirectShow進(jìn)行多媒體應(yīng)用程序的開發(fā)需了解多方面的知識,但在很多應(yīng)用中利用DirectShow的特性可以減少工作量并能獲得非常高的運(yùn)行效率。在Visual C++ 6.0的開發(fā)環(huán)境中利用DirectShow開發(fā)的簡單媒體播放器,具有隨機(jī)播放、暫停和調(diào)整播放速率等功能,且可以播放多種媒體文件,播放效果非常流暢。因此,基于DirectShow開發(fā)多媒體應(yīng)用程序的方法簡單高效,是一種值得推薦的方法。

posted on 2009-08-06 16:59 Bluesea 閱讀(2118) 評論(0)  編輯 收藏 引用 所屬分類: COM
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩国产精品一区| 奶水喷射视频一区| 午夜精品国产| 欧美激情在线观看| 精品动漫3d一区二区三区| 亚洲永久字幕| 亚洲国产高清一区| 亚洲午夜性刺激影院| 欧美人与禽性xxxxx杂性| 亚洲电影在线免费观看| 久久视频国产精品免费视频在线| 亚洲美女福利视频网站| 欧美久久视频| 亚洲精品一区在线观看香蕉| 牛牛国产精品| 久久精品av麻豆的观看方式| 韩国欧美一区| 久久免费99精品久久久久久| 欧美在线黄色| 激情欧美一区| 欧美国产日本高清在线| 欧美xxxx在线观看| 一本色道久久综合亚洲精品高清| 亚洲人成网在线播放| 欧美巨乳在线观看| 在线中文字幕日韩| 亚洲欧美在线免费| 亚洲高清精品中出| 99精品视频免费观看视频| 欧美性猛片xxxx免费看久爱| 欧美一级播放| 久久青青草原一区二区| 亚洲激情一区二区三区| 亚洲精品乱码久久久久久久久 | av成人老司机| 欧美日韩日日夜夜| 亚洲视频在线观看免费| 亚洲一区国产精品| 国产一区视频观看| 欧美国产日本| 欧美亚州在线观看| 久久激情五月婷婷| 你懂的视频一区二区| 亚洲视屏一区| 久久精品欧美日韩精品| 最新中文字幕一区二区三区| 99成人在线| 一区视频在线看| 亚洲精品视频二区| 国产日韩综合一区二区性色av| 欧美.com| 国产精品中文在线| 91久久嫩草影院一区二区| 国产伦精品一区二区三区视频黑人| 欧美成人一区二区在线 | 新片速递亚洲合集欧美合集| 久久噜噜噜精品国产亚洲综合| 在线综合欧美| 久久综合精品国产一区二区三区| 制服丝袜激情欧洲亚洲| 久久久欧美精品sm网站| 亚洲欧美日韩国产中文在线| 免费在线亚洲| 欧美在线影院| 欧美日韩第一页| 蜜桃av综合| 国产视频精品xxxx| 这里是久久伊人| 亚洲精品久久久蜜桃| 久久aⅴ国产欧美74aaa| 亚洲男人av电影| 欧美.com| 另类专区欧美制服同性| 国产精品日韩二区| 99精品视频免费观看| 亚洲人成网站色ww在线| 久久精品在线| 久久精品国产一区二区三| 国产精品久久久久91| 亚洲理论电影网| 亚洲精品视频一区| 毛片一区二区| 欧美成人免费网| 精品成人在线观看| 欧美在线地址| 欧美呦呦网站| 国产精品一区二区a| 国产欧美在线视频| 亚洲欧美国产制服动漫| 亚洲专区在线视频| 国产精品啊啊啊| 一区二区三区欧美在线观看| 亚洲视频你懂的| 欧美三级不卡| 99伊人成综合| 久久亚裔精品欧美| 在线性视频日韩欧美| 欧美在线不卡| 久久久青草婷婷精品综合日韩 | 欧美激情在线狂野欧美精品| 亚洲国产欧美日韩精品| 亚洲国产婷婷香蕉久久久久久| 久久综合九色综合久99| 欧美激情网友自拍| 一本色道久久88精品综合| 欧美成人激情视频| 亚洲卡通欧美制服中文| 亚洲一二三级电影| 国产日产亚洲精品| 久久视频在线看| 亚洲国产欧美精品| 亚洲手机成人高清视频| 国产精品日韩一区| 久久国产精品网站| 亚洲电影毛片| 亚洲综合色丁香婷婷六月图片| 国产精品v欧美精品v日韩 | 国产精品激情偷乱一区二区∴| 夜夜嗨av一区二区三区网页| 羞羞视频在线观看欧美| 黄色成人av| 欧美精品videossex性护士| 一区二区精品国产| 欧美成人首页| 一本色道久久综合亚洲精品不| 午夜精品久久久久久久| 娇妻被交换粗又大又硬视频欧美| 欧美成人一区二区在线| 亚洲一区中文字幕在线观看| 麻豆久久精品| 亚洲一区视频| 黄色国产精品一区二区三区| 欧美极品在线观看| 欧美一区观看| 亚洲精品视频在线看| 久久精品一区四区| 一区二区三区精品| 国产综合一区二区| 欧美激情综合网| 久久国产精品99国产精| 99成人精品| 欧美成人综合在线| 欧美影院一区| 亚洲一区二区久久| 亚洲人成人一区二区三区| 国产亚洲欧美日韩精品| 欧美电影电视剧在线观看| 亚洲欧美在线一区| 一本色道久久88精品综合| 欧美成人蜜桃| 久久精品国产999大香线蕉| 一本色道久久综合亚洲精品不卡| 一区二区在线视频| 国产欧美视频在线观看| 欧美日韩精品综合| 男人的天堂亚洲| 久久精品五月| 亚洲一区三区视频在线观看| 亚洲精品视频免费在线观看| 欧美激情麻豆| 久久综合给合久久狠狠狠97色69| 亚洲一区三区电影在线观看| 在线天堂一区av电影| 亚洲精品视频在线观看免费| 亚洲成人资源网| 欧美另类视频| 亚洲精品国精品久久99热一 | 午夜久久99| 亚洲午夜av电影| 99视频日韩| 99精品免费网| 一个色综合av| 一区二区三区欧美视频| 一区二区精品在线观看| 中文国产成人精品久久一| aa国产精品| 亚洲精品久久| 日韩一级不卡| 在线一区观看| 亚洲一区二区三区国产| 亚洲免费视频中文字幕| 午夜精品久久一牛影视| 久久成人国产| 久久裸体艺术| 免费av成人在线| 欧美电影电视剧在线观看| 欧美精品久久99| 欧美日韩视频在线一区二区观看视频| 欧美精品成人| 欧美日韩亚洲91| 欧美午夜精品| 国产精品五月天| 国产亚洲欧美日韩日本| 激情欧美一区二区三区| 亚洲精品一二三区| 亚洲视频中文| 久久中文在线| 91久久精品国产91性色| 一区二区三区久久久| 欧美一级艳片视频免费观看|