




已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
文件系統(tǒng)驅(qū)動編程基礎(chǔ)篇之6DirectShow 關(guān)鍵字:文件系統(tǒng)驅(qū)動編程,DirectShow 作者:wskjuf 更新:2008-10-06 22:14:09 瀏覽:2466文件系統(tǒng)驅(qū)動編程基礎(chǔ)篇之六DirectShow一、前略 本系列文章為業(yè)余編程愛好者而寫,僅僅作為初學(xué)者的一個借鑒,真正的精華存在于參考資料*中。知識的積累將經(jīng)歷從薄到厚,再從厚到薄的反復(fù)過程,為了打下牢固的基礎(chǔ),請讀者務(wù)必在閱讀本文的基礎(chǔ)上花費必要的時間完成參考資料。參考資料*:1.Programming Microsoft DirectShow for Digital Video and Television及其示例代碼2.DirectShow for DirectX 8.1 SDK C+3. Microsoft Windows Software Development Kit Update for Windows Vista 之相關(guān)文檔及其示例代碼4.DirectShow開發(fā)快速入門之慨述5.深入解析ATL (ATL Internals Second Edition Working with ATL 8)6.COM 組件設(shè)計與應(yīng)用(一)起源及復(fù)合文件(/document/viewdoc/?id=1483)閱讀基礎(chǔ):少量的COM編程的基礎(chǔ)知識,了解如何調(diào)用COM組件的方法,最好掌握哪怕一丁點的ATL。本章目的:了解DirectX組件架構(gòu),學(xué)習(xí)編寫簡單的DirectShow程序。二、DirectX與DirectShow首先看下面兩段關(guān)于DirectX和DirectShow相關(guān)內(nèi)容的摘要:DirectX的第一個版本作為Windows Games SDK發(fā)布于1995年9月,它作為Windows API的一部分用以替換Windows 3.1中的DCI和WinGAPI。ATI的一個開發(fā)團(tuán)隊為微軟帶來了基本的游戲影像技術(shù),微軟方面,DirectX由專門的團(tuán)隊負(fù)責(zé)開發(fā),Eisler 為團(tuán)隊領(lǐng)導(dǎo),而St. John和Engstrom則成為主程序設(shè)計師。2005年4月,DirectShow從DirectX移除,加入到Microsoft Platform SDK。Windows系統(tǒng)的架構(gòu)下,我們不能如Dos般隨心所欲的控制硬件,而希望游戲、影像開發(fā)人員對內(nèi)核的理解都達(dá)到驅(qū)動編程人員的水平,是一件苛求的事情,但是為此將失去廣大市場的關(guān)鍵問題必然要產(chǎn)生解決的辦法,因此,DirectX或其他不同名的相同技術(shù)的出現(xiàn)是件必然的。有些讀者可能會對驅(qū)動編程的基礎(chǔ)文章涉及DirectX的必要性有所疑問,確實,DirectX并不是學(xué)習(xí)驅(qū)動編程的一個障礙,筆者在初次的學(xué)習(xí)中也從未意識過要了解這方面的內(nèi)容。但是換一個角度,如果你看到雞窩里的五個雞蛋,我們是不是很有理由猜測這是由五只母雞組成的五好家庭?因此我們可很牽強(qiáng)的認(rèn)為DirectX如同內(nèi)核的外部據(jù)點,如果我們拔除了,必然有更大的把握向內(nèi)核發(fā)動總攻。筆者把DirectX加入本系列文章的另一個重要原因是DirectX確實有值得炫耀的資本。對于編程人員來說,它的COM接口簡直可用“優(yōu)雅”來評價,當(dāng)你用著如苦瓜般的IMarshal接口時,不妨來看看什么樣的接口值得這樣的評價。我挑選了DirectX里一個很有意思的部分DirecShow來作為突破口,講述如何“Direct”直接的控制視頻設(shè)備。學(xué)習(xí)的進(jìn)階大略上可分為四個部分:學(xué)習(xí)調(diào)用組件、捕獲和編輯影像、學(xué)習(xí)編寫過濾器、掌握媒體格式的高階部分。限于能力,只介紹前兩個部分。讀者不要滿足于學(xué)會使用DirctShow,而是通過DirctShow的具體功能猜測系統(tǒng)驅(qū)動的功能,甚至設(shè)備的構(gòu)成,減輕將來主攻驅(qū)動時的負(fù)擔(dān),此即由外而內(nèi)的學(xué)習(xí)方法。筆者將掠人之美,使用參考資料1提供的示例闡明編程的基本思路。三、DirectShow基礎(chǔ)和GraphEdit在Windows系統(tǒng)中,DirectShow以COM組件的形式存在,下圖描繪了DirectShow組件、硬件以及系統(tǒng)組件的關(guān)系(Leagcy為傳統(tǒng)或遺留,舊的之意)。現(xiàn)在我們只需了解DirectShow里包含了兩大類型的對象:三類“Filter”(源、轉(zhuǎn)換、渲染過濾器),以及由這些過濾器集組成提供特定功能的“Filter Graph”,這個Graph不妨看成是包含F(xiàn)ilter的一個容器。為了從可視化的角度理解DirectShow工作的方式,我們可使用SDK附帶的GraphEdit工具。它最基本的功能是利用系統(tǒng)里已經(jīng)安裝的解碼器,使用DirectShow組件來播放媒體文件,并直觀的顯示播放流程。下面演示一下如何播放一個媒體文件。GraphEdit的界面如圖:? 從菜單文件渲染媒體文件里選擇你要播放的文件,這里我們選擇一個微軟支持的avi格式文件ff8-full-ending.avi,則界面上出現(xiàn):每一個DirectShow組件都以矩形框表示,Input、Output針(pin)作為每個過濾器的輸入或輸出。通常情況下,源(左上角的ffi_full_ending.avi)、渲染過濾器(Video Renderer和Default DirectSound Device)是必須的,轉(zhuǎn)換過濾器根據(jù)實際情況可選。從菜單圖表插入過濾器可以看到所有可用的過濾器。上圖隱含了DirctShow的“智能選擇”功能,即如果你提供了任何兩個邏輯關(guān)聯(lián)的渲染器(如MPC Avi Splitter和Video Renderer),DirectShow會自動查找之間的可用組件,形成一個正常的播放流程。讀者如果想真正掌握DirectShow,應(yīng)該學(xué)會手工添加、連接合適的過濾器而不僅僅依賴于“智能選擇”功能。由圖可知,avi文件被播放前,經(jīng)過分離器的分離,形成視頻和音頻兩個部分,它們再選擇合適的解碼器,最后分別送到系統(tǒng)默認(rèn)的渲染過濾器上進(jìn)行渲染,影像就顯現(xiàn)于屏幕上了。點一下界面上綠色三角的播放鍵,則可以欣賞我們的影片了。這一切出乎意料的簡單,這使我們不由產(chǎn)生了這么一個想法DirctShow的初級應(yīng)用也是非常簡單的,事實正是如此。在進(jìn)價的第一部分,我們學(xué)習(xí)如何通過調(diào)用組件,完成一個媒體文件的播放。四、進(jìn)價之一組件的調(diào)用 本篇將要接觸到下表組件的調(diào)用,詳細(xì)的信息可參考Msdn上的說明,這些基礎(chǔ)工作留給有心的讀者來完成吧: IID CREATE CLSIDREMARKIBaseFilter CLSID_VideoMixingRenderer9,primary interface for DirectShow filtersICreateDevEnumCLSID_SystemDeviceEnumcreates an enumerator for a category of filtersIEnumMonikerCLSID_AudioInputDeviceCategoryenumerate the components of a moniker or to enumerate the monikers in a table of monikersIEnumPins The filter graph manager uses this interface when it connects filters. Applications can use it to retrieve pins on a filterIFileSinkFilter write media streams to a fileIFilterGraph provides methods for building a filter graphIfilterGraph2 extends the IFilterGraph and IGraphBuilder interfaces, which contain methods for building filter graphsIGraphBuilderCLSID_FilterGraphinherited from IfilterGraph IMediaControl provides methods for controlling the flow of data through the filter graphIMediaEvent contains methods for retrieving event notifications and for overriding the Filter Graph Managers default handling of eventsIMediaEventEx IMediaSeeking contains methods for seeking to a position within a stream, and for setting the playback rate.IMoniker contains methods that allow you to use a moniker object, which contains information that uniquely identifies a COM objectIPropertyBag Provides an object with a property bag in which the object can save its properties persistentlyIPersistStream provides methods for saving and loading objects that use a simple serial stream for their storage needsIPin The filter graph manager uses this interface to connect pins and perform flushing operationsIPropertyBag Provides an object with a property bag in which the object can save its properties persistently.IStream The IStream interface lets you read and write data to stream objectsIStorage supports the creation and management of structured storage objectsIVMRFilterConfig9 configure the VMRs operating mode and video rendering mechanismsIVMRMixerControl9 enables an application to manipulate the incoming video streams on the VMR-9IVMRWindowlessControl9 controls how the VMR-9 renders a video stream within a container window編程可任選Microsoft或CodeGear公司的編譯器。如果使用vs,可以在微軟站點下載并安裝最新的SDK,如果使用C+Builder,可通過互聯(lián)網(wǎng)下載DirectX 9 SDK for Borland C+ Builder。本篇以vs2005作為默認(rèn)編譯器,示例選用參考資料1的DSRender、DSBuild和PIP9。(一)DSRender/ 本文轉(zhuǎn)自 C+Builder研究 - /article.asp?i=1059&d=4rpi03DSRender模擬了GraphEdit打開一個媒體文件播放的行為,代碼很簡單,僅僅用到了IGraphBuilder,IMediaControl,IMediaEvent三個接口提供的方法,播放窗口為系統(tǒng)創(chuàng)建,我們不能設(shè)置到自定義窗口。代碼里值得一提的是保存上圖配置的函數(shù)SaveGraphFile,涉及了IStorage和IPersistStream兩個接口,同時涉及了復(fù)合文件(Compound file storage object)這一個概念。復(fù)合文件仿佛一個包含若干文件、子文件夾的文件夾,是若干普通文件、子復(fù)合文件的組合。通常使用的ReadFile、WriteFile函數(shù)以字節(jié)指針形式操縱單一文件,而復(fù)合文件里的文件卻是以流對象(Stream Object)的形式存在,并強(qiáng)調(diào)了流對象的嵌套行為。從這種角度來看,前者象結(jié)構(gòu)化編程的C,后者象面向?qū)ο缶幊痰腃+??砷喿xMsdn里的相關(guān)文章更深入的理解復(fù)合文件。(二)DSBuildDsBuild模擬了手工添加過濾器的行為。稍微有點意思的是GetPin函數(shù),它通過枚舉每個過濾器的針腳,檢查并返回所查詢的輸入或輸出針腳。過濾器間的針腳相連非常的簡單,通過IGraphBuilder接口的Connect方法將上游過濾器的輸出針腳和下游過濾器的輸入針腳相連即可。五、進(jìn)價之二捕獲和編輯影像 李逵的三板斧現(xiàn)在也該掄出最后一板了,倒不是黔驢已經(jīng)技窮(汗一下,是嗎,有人這樣說嗎?),筆者相信這已經(jīng)足夠了,經(jīng)過努力閱讀參考資料的讀者已經(jīng)找到了前進(jìn)的方向,本篇的內(nèi)容雖然不多,卻點到了DirectShow很多基礎(chǔ)的知識,如果不把它們從薄讀到厚,那么本文還有什么意義呢?這部分的內(nèi)容可以細(xì)讀參考資料1的第49章,料想考試時在試卷上寫,“本題請老師參考課本第xxx頁完成”必定落個紅燈的下場,故筆者打算稍微分析一下第9章所介紹的殺手锏用Video Mixing Renderer(VMR)來生成影像的畫中畫程序PIP9。即使包括頭文件,Pip9的總代碼量也不過1500行,提示和空格真正體現(xiàn)了本站資源華為編程規(guī)范和范例(PDF)里對注釋不少于20的要求,如果使用可視化控件編程,代碼量大約又可減少1/3,兼之很多接口在上兩個程序中已經(jīng)接觸過,因此本節(jié)的重點放在了畫中畫的主線VMR9的操作上。首先我們從整體上把握VMR。從上圖看VMR過濾器類似于可以完成具體功能的集成電路,而不再是一個晶體管。它用于管理多重流媒體的渲染,在VMR9版本下,可以管理多達(dá)16個的輸入管腳。需要重點查看的函數(shù)為: 1BlendVideo : ConfigureMultiFileVMR9 - AddGraphToRot2ConfigureMultiFileVMR9 : InitializeWindowlessVMR - RenderFileToVMR9 上述6個函數(shù)完成了畫中畫的播放效果,涉及的VMR接口為IVMRFilterConfig9、IVMRMixerControl9和IVMRWindowlessControl9。在這里,我們終于可以隨心所欲的實現(xiàn)自定義的播放窗口了。欣賞著稍帶回音效果
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年臺州駕??荚嚱叹殕T考試題
- 2025年湖南省中考數(shù)學(xué)真題(解析版)
- 給頂撞的檢討書
- 心肺復(fù)蘇的題目及答案
- ??钾斮Q(mào)題目及答案
- 小學(xué)英語特殊題目及答案
- 專項復(fù)習(xí):相似三角形幾何模型(旋轉(zhuǎn)模型)(基礎(chǔ)練)
- 青海2024《行測》真題
- 2024年黑龍江省東北石油大學(xué)招聘考試真題
- 新課程改革形勢下高中音樂教學(xué)的創(chuàng)新路徑研究
- 【MOOC】運輸包裝-暨南大學(xué) 中國大學(xué)慕課MOOC答案
- 小學(xué)語文1-6年級·課內(nèi)16則文言文·譯文注釋
- 美容院服務(wù)項目及操作流程手冊
- 《食用亞麻籽(粉)等級規(guī)格》編制說明
- 食堂工作人員考核方案
- 廣東省廣州市海珠區(qū)2023-2024學(xué)年六年級下學(xué)期期末考試英語試卷
- 臨床營養(yǎng)(043)(正高級)高級衛(wèi)生專業(yè)技術(shù)資格考試試卷及答案指導(dǎo)(2025年)
- 2024年貴州退役軍人事務(wù)廳事業(yè)單位筆試真題
- 浙江省寧波市鄞州區(qū)2023-2024學(xué)年四年級下學(xué)期期末數(shù)學(xué)試題
- 2024年全國寄生蟲病防治技能競賽考試題庫(含答案)
- 校服采購?fù)稑?biāo)方案
評論
0/150
提交評論