在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)

上傳人:29 文檔編號:66871189 上傳時間:2022-03-29 格式:DOC 頁數(shù):54 大?。?.30MB
收藏 版權(quán)申訴 舉報 下載
在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)_第1頁
第1頁 / 共54頁
在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)_第2頁
第2頁 / 共54頁
在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)_第3頁
第3頁 / 共54頁

下載文檔到電腦,查找使用更方便

0 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)》由會員分享,可在線閱讀,更多相關(guān)《在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)(54頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、精選優(yōu)質(zhì)文檔-傾情為你奉上 題 目 在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn) 學(xué)生姓名 崔媛媛 學(xué)號 所在學(xué)院 物理與電信工程學(xué)院 專業(yè)班級 電子1202 指導(dǎo)教師 李菊葉 完成地點 物電學(xué)院計算機信息處理分室 2016 年 6 月 5 日專心-專注-專業(yè)畢業(yè)論文設(shè)計任務(wù)書院(系) 物電學(xué)院 專業(yè)班級 電子信息工程 學(xué)生姓名 崔媛媛 一、畢業(yè)論文設(shè)計題目 在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn) 二、畢業(yè)論文設(shè)計工作自 2016 年 3 月 10 日 起至 2016 年 6 月 20 日止三、畢業(yè)論文設(shè)計進行地點: 物電學(xué)院計算機信息處理分室 四、畢業(yè)論文設(shè)計的內(nèi)容要求:隨著網(wǎng)絡(luò)的普及,在線播放器也日益普及起來。本設(shè)

2、計要求學(xué)生利用Visual C+為開發(fā)工具,使用DirectShow SDK技術(shù)開發(fā)一個功能齊全的視頻播放器,要求能夠?qū)τ脖P或存儲設(shè)備上的多媒體文件進行播放,及在回放或顯示過程中,用戶可以控制回放的動作和顯示特性等相關(guān)功能。 五、 畢業(yè)論文設(shè)計應(yīng)收集資料及參考文獻: 1徐孝凱,張紀勇.C+面向?qū)ο蟪绦蛟O(shè)計:VC+6.0運行環(huán)境M.天津大學(xué)出版社2009. 2汪曉平,鐘軍.VC+網(wǎng)絡(luò)通信協(xié)議分析與應(yīng)用實現(xiàn)M.北京:人民郵電出版社,2003. 3王艷平,張越.Windows網(wǎng)絡(luò)與通信程序設(shè)計M.北京:人民郵電出版社,2006. 4 Andrew S.Tanenbau.計算機網(wǎng)絡(luò)(第四版)M.北京:

3、清華大學(xué)出版社,2004. 5謝希仁.計算機網(wǎng)絡(luò)(第五版)M.北京:電子工業(yè)出版社,2012. 6朱桂英.張元亮 Visual C+網(wǎng)絡(luò)編程開發(fā)與實踐M.清華大學(xué)出版社.2013. 六、 畢業(yè)論文設(shè)計的進度安排: 3月2日3月29日:查閱資料,完成初步設(shè)計方案和開題報告。 4月1日4月26日:根據(jù)視頻播放系統(tǒng)的工作原理,給出設(shè)計方案,及軟件流程圖。 4月29日5月24:并在軟件環(huán)境下進行運行調(diào)試,進一步完善系統(tǒng)功能,整理資料; 5月27日6月7日:撰寫、修改畢業(yè)設(shè)計論文。 6月10日6月15日:打印論文準備并完成答辯。 指導(dǎo)教師簽名 系(教研室)主任簽名 專業(yè)負責(zé)人簽名 批準日期 在線視頻播放

4、系統(tǒng)的實現(xiàn)與設(shè)計崔媛媛(陜西理工學(xué)院物理與電信工程學(xué)院電子信息工程專業(yè),2012級2班,陜西 漢中 )指導(dǎo)教師:李菊葉摘要本設(shè)計在Visual C+環(huán)境下,利用MFC程序設(shè)計方法。并利用DirectShow的播放器核心技術(shù),重點實現(xiàn)了播放、暫停、停止 、聲音控制、進度控制、抓取視頻幀、播放模式控制、全屏等功能。通過對系統(tǒng)的需求分析、設(shè)計、實現(xiàn),完成了多媒體播放器系統(tǒng),各項功能使用正常,并給出了實現(xiàn)關(guān)鍵代碼。DirectShow是基于COM組件,它是二進制級別的(不受限于編程語言和操作系統(tǒng)),具有很好的兼容性和移植性。關(guān)鍵字Visual C+;MFC;DirectShow;播放器The desi

5、gn and implement of online video broadcast systemCui Yuanyuan(Grade12,Class02,Major electronics and information engineering,School of Physics and Telecommunication Engineering,Shaanxi University of Technology,Hanzhong ,Shaanxi)Tutor:Li JuyeAbstract:This design uses MFC program design methods Under V

6、isual C+ environment. At the same time,uses DirectShow player core technology. Focus to achieve the play, pause, stop, sound control, schedule control, grab video frames, playback mode control, full screen and other functions.Through the system requirements analysis, design, implementation, complete

7、d a media player system, various functions normal use, and gives the realization key code.DirectShow is based on the COM component, it is a binary level (not limited to programming languages and operating systems), has good compatibility and portability. Keywords: Visual C+ ;MFC;DirectShow;Player目錄1

8、.引言隨著社會的發(fā)展,信息技術(shù)越來越發(fā)達,在線視頻播放器在未來社會應(yīng)用也會越來越普遍。Microsoft的Windows操作系統(tǒng)作為全球最主流、最常用的操作系統(tǒng),掌握在它上面的多媒體開發(fā)技術(shù)顯得越來越需要,相對于其他多媒體開發(fā)技術(shù),掌握它本身提供的DirectX多媒體開發(fā)包顯得更為適合。DirectShow是微軟提供的多媒體開發(fā)包DirectX中的一部分,它是建立在DirectDraw和DirectSound基礎(chǔ)之上。 Microsoft給DirectShow程序員提供了一套開發(fā)多媒體標準的、統(tǒng)一的、高效的API接口,這些接口使得多媒體數(shù)據(jù)的回放變得簡單,剝離了應(yīng)用程序和硬件底層的差異性。而D

9、irectShow是基于COM組件的開發(fā)包,COM是基于二進制代碼級的協(xié)議(與編程語言無關(guān)的協(xié)議),對使用DirectShow開發(fā)的軟件以后的移植和兼容問題提供了良好的解決方案。 DirectShow使用智能連接開發(fā)多媒體應(yīng)用程序,大大簡化了開發(fā)人員工作量,同時開發(fā)人員亦可開發(fā)自定義的濾波器。使得基于DirectShow的應(yīng)用程序可以充分滿足不同用戶的需求。在未來幾年中,DirectShow技術(shù)的發(fā)展前景將是非常廣闊的。1.1背景 當今信息技術(shù)越來越發(fā)達,社會越來越信息化、智能化,多媒體在未來社會應(yīng)用越來越廣泛。Microsoft的Windows操作系統(tǒng)作為全球最主流、最常用的操作系統(tǒng),掌握在

10、它上面的多媒體開發(fā)技術(shù)顯得越來越需要,相對于其他多媒體開發(fā)技術(shù),掌握它本身提供的DirectX多媒體開發(fā)包顯得更為適合。1.2 研究目的 DirectShow是微軟提供的多媒體開發(fā)包DirectX中的一部分,它是建立在DirectDraw和DirectSound基礎(chǔ)之上。 Microsoft給DirectShow程序員提供了一套開發(fā)多媒體標準的、統(tǒng)一的、高效的API接口,這些接口使得多媒體數(shù)據(jù)的回放變得簡單,剝離了應(yīng)用程序和硬件底層的差異性。而DirectShow是基于COM組件的開發(fā)包,COM是基于二進制代碼級的協(xié)議(與編程語言無關(guān)的協(xié)議),對使用DirectShow開發(fā)的軟件以后的移植和兼

11、容問題提供了良好的解決方案。 DirectShow使用智能連接開發(fā)多媒體應(yīng)用程序,大大簡化了開發(fā)人員工作量,同時開發(fā)人員亦可開發(fā)自定義的濾波器。使得基于DirectShow的應(yīng)用程序可以充分滿足不同用戶的需求。在未來幾年中DirectShow技術(shù)的發(fā)展前景將是非常廣闊的。1.3 開發(fā)環(huán)境及語言本文中視頻播放系統(tǒng)使用C+語言及Directshow SDK技術(shù),使用visual c+ 2010軟件在directshow的開發(fā)環(huán)境下進行視頻播放器的開發(fā)。1.3.1 VC+2010平臺Microsoft ,(簡稱Visual C+、MSVC、VC+或VC)C+語言開發(fā)工具,一個,能夠提供編輯C語言,C

12、+以及C+/CLI系列。VC+整合便利的除錯工具,尤其是整合、三維的動畫DirectX API,Microsoft .NET框架1。Microsoft Visual C+是微軟公司推行開發(fā)的Win32環(huán)境程序、面向?qū)ο笄铱梢暬募苫删幊滔到y(tǒng)。其主要優(yōu)點如下:(1)程序框架能夠自動生成(2)便于靈活類管理(3)代碼編寫與界面的設(shè)計可集成相互操作(4)可開發(fā)各種程序(5)支持各個數(shù)據(jù)庫的接口、OLE2、WinSock網(wǎng)絡(luò)和3D控制界面1.3.2 MFC概述MFC(Microsoft Foundation Classes)是微軟公司所提供的類型庫(class libraries),以C+類的方式

13、封裝了Windows的API,且含有應(yīng)用程序的框架,來減少程序開發(fā)者的工作量。MFC中的關(guān)鍵技術(shù):(1)MFC程序的初始化過程建立一個MFC窗口:從CWinApp派生應(yīng)用程序類,然后建立應(yīng)用程序?qū)ο螅╰heApp)。(2)動態(tài)創(chuàng)建運行的時候創(chuàng)建指定的類的對象。比如視對象、框架的窗口對象等等,比如文檔對象需由文檔模版類對象進行動態(tài)的創(chuàng)建。 (3)串行化盡管程序中有著各種數(shù)據(jù),串行化機制也如流水般按照順序儲存置于單一文件里,并且也能按照順序取出,成為不同對象的數(shù)據(jù)。 (4)消息映射和傳遞MFC把SDK編程中對消息的產(chǎn)生、傳遞、到過程函數(shù)中響應(yīng)的過程封裝起來,形成消息映射宏、消息映射表和消息響應(yīng)函數(shù)

14、體系,更加直觀和便于操作2。 2. DirectShow介紹2.1 DirectShow系統(tǒng)DirectShow是新一代基于COM的流媒體處理的開發(fā)包,是微軟公司在ActiveMovie和Video for Windows的基礎(chǔ)上推出的,與DirectX開發(fā)包共同發(fā)布。Directshow為多媒體的回放和捕捉提供了有力強大的支持。應(yīng)用DirectShow,能方便地在支持WDM中捕獲數(shù)據(jù),且后期進行一些相應(yīng)處理乃至儲存到文件里。這樣在多媒體的數(shù)據(jù)庫管理系統(tǒng)里多媒體的數(shù)據(jù)存取就會更加方便。它的架構(gòu)如圖1所示。圖中央即是DirectShow系統(tǒng),虛線下面是Ring 0特權(quán)級硬件設(shè)備,虛線上面是Rin

15、g 3特權(quán)級的應(yīng)用層。DirectShow系統(tǒng)處于應(yīng)用層。它用Filter Graph模型來管理整體數(shù)據(jù)流的處理。參與數(shù)據(jù)的處理的各功能模塊稱做Filter;各個Filter在Filter Graph中按相應(yīng)順序連成一條“流水線”協(xié)調(diào)工作3。事件Directshow文件系統(tǒng)RenderingFilters命令文件系統(tǒng)因特網(wǎng)VFW采集設(shè)備內(nèi)核流架構(gòu)WDM采集MPEG2硬件解碼器ACM/VCM編解碼器顯卡DirectDraw應(yīng)用程序 Filter Graph ManagerSourceFiltersTransformFilters聲卡DirectSound圖2.1 DirectShow架構(gòu)2.2

16、DirectShow技術(shù)2.2.1 過濾器過濾器是DirectShow 的基本組成單元。DirectShow把數(shù)字媒體的處理(播放、捕獲和格式轉(zhuǎn)換)劃分為一些獨立的步驟,過濾器就是完成一個或多個步驟的COM 對象。DirectShow提供了一組標準的過濾器供應(yīng)用程序使用,程序開發(fā)者也可以創(chuàng)建自定義的過濾器來擴充Directshow的功能,但必須是以COM形式建立的4。按照功能來分,F(xiàn)ilter大致分為3類:Source Filter、Transform Filter和Rendering Filter。所有能生成流的DS filter都可以認為是Source filter。這個流可以源自硬盤上的

17、文件,也可以是實時設(shè)備,如話筒,攝像頭,或是DC。如果這個流是源自磁盤,那么它可以是預(yù)先記錄的WAV, AVI或是Windows Media文件。相應(yīng)的,如果源是一個實時設(shè)備,那么它可以是Window兼容的所有外設(shè)。DS是緊密綁定在WDM上,所有的安裝后的多媒體設(shè)備的WDM驅(qū)動都自動可作為DS的源filter。因此,例如,安裝了驅(qū)動的攝像頭可以立即成為DS的源filter。將實時設(shè)備轉(zhuǎn)換成DS流的源filter又可以稱作捕捉源filter。第12章詳細描述了源filter的設(shè)計實現(xiàn)。Transform Filter是DS著墨最多的工作。轉(zhuǎn)換filter從其它filter(可能是源filter)

18、接收一個輸入流,對流執(zhí)行某些操作后,將流傳輸給下一個filter。幾乎所有能相像得到的對音視頻流的操作都可以在轉(zhuǎn)換filter中實現(xiàn)。一個轉(zhuǎn)換filter可以解析流的數(shù)據(jù),編碼它(可能將WAV數(shù)據(jù)轉(zhuǎn)換成MP3格式)或解碼它,或?qū)σ粋€視頻序列添加一個文字層。DS包含有大量的轉(zhuǎn)換filter,如編碼或解碼各種各樣的音視頻格式。 轉(zhuǎn)換filter同樣還可以給流創(chuàng)建一個多通管道,意思是一個輸入流可以復(fù)制到一個或多個輸出pin上。而有些轉(zhuǎn)換filter可以將多個輸入流混合成一個流。渲染filter將DS流轉(zhuǎn)換成某種形式的輸出。如基本的渲染filter可以將流寫到文件。而其它的渲染filter可以將音頻流

19、發(fā)送到揚聲器,或?qū)⒁曨l流發(fā)送到桌面上的窗口。DirectShow中的Direct反映的是:使用DirectDraw和DirectSound的渲染filter支持將它的流高效傳輸給顯卡和聲卡的技術(shù)。這個能力意味著DS的渲染filter能進行快速且無關(guān)用戶-內(nèi)核模式的傳輸。(對于OS來說,這個處理意味著將數(shù)據(jù)從用戶層傳輸?shù)絻?nèi)核層)。一個filter graph可以有多個渲染filter。如使用一個多通管道將一路視頻流送到一個渲染filter以生成文件,另一路則將它送到另一個渲染filter以用于顯示。從而可以實現(xiàn)監(jiān)視視頻的同時寫文件。簡單來說,Source Filter主要負責(zé)獲取數(shù)據(jù),數(shù)據(jù)源可以

20、是文件、因特網(wǎng)計算機里的采集卡(WDM驅(qū)動的或VFW驅(qū)動的)數(shù)字攝像機等,然后將數(shù)據(jù)往下傳輸;Transform Filter主要負責(zé)數(shù)據(jù)的格式轉(zhuǎn)換,例如數(shù)據(jù)流分離、合成,解碼、編碼等,然后將數(shù)據(jù)繼續(xù)往下傳輸;Rendering Filter主要負責(zé)數(shù)據(jù)的最終去向?qū)?shù)據(jù)送給顯卡、聲卡進行多媒體的演示,或者輸出到文件進行存儲。2.2.2 COM組件Directshow是基于COM的流媒體處理的開發(fā)包。COM是一種跨應(yīng)用和語言共享的二進制代碼的方法,它是一個開放的組件標準,具有很強的擴展與擴充能力5。優(yōu)點如下:(1) 可以方便的將應(yīng)用系統(tǒng)擴展至網(wǎng)絡(luò)環(huán)境;(2) 可以將系統(tǒng)中的組件用新的代替掉,以方

21、便隨時進行系統(tǒng)的升級和定制;(3) 可以在多個應(yīng)用系統(tǒng)中多次利用同一個組件;(4) COM組件與語言和平臺無關(guān)。 2.2.3針腳Pin過濾器能和一個或者多個過濾器相連,連接接口是COM形式,叫引腳。過濾器用引腳在各過濾器之間傳輸各種數(shù)據(jù)。每個引腳都是從IPin這個COM對象派生出來的。每個引腳都是過濾器私有的對象,過濾器能動態(tài)地創(chuàng)建引腳、銷毀引腳、自由地控制引腳的生存時間。引腳可分為兩種類型:輸出引腳和輸入引腳。相連的兩個引腳須是不同類型的,即輸入引腳只能和輸出引腳相連,并且連接方向常是由輸出引腳指向輸入引腳的。Filter一般由一個或多個Pin組成,F(xiàn)ilter之間通過Pin相互連接,構(gòu)成一

22、條順序的鏈路。Filter的分類亦可根據(jù)Filter包含的輸入Pin或者輸出Pin的數(shù)量進行。過濾器間的連接,實質(zhì)上就是連接雙方的媒體類型媒體協(xié)商的過程。連接大致的過程為:若調(diào)用連接函數(shù)的時候已指定完整的媒體類型,那么用此媒體類型進行連接,是否成功都要結(jié)束連接進程;如不完全指定或沒有指定媒體的類型,就進行下面的枚舉過程:枚舉欲連接的輸入引腳上的所有的媒體類型,逐一使用此媒體類型和輸出引腳進行連接(如連接函數(shù)提供不完全媒體類型,就要先把每個枚舉出的媒體類型和它進行匹配檢查),若輸出引腳也接受此媒體類型,那么引腳間的連接就成功了;如果輸出引腳對全部輸入引腳上所枚舉的媒體類型均不支持,那么就枚舉輸出

23、引腳上的全部媒體類型,且逐一利用這些媒體類型和輸入引腳來進行連接,如果輸入引腳接受其中的一種媒體類型,那么引腳間的連接就成功了;如果對輸出引腳上的全部媒體類型輸入引腳均不支持,則這兩個引腳間的連接過程宣告失敗。如圖2所示,僅含有輸出Pin,沒有輸入Pin的Filter為Source Filter;既有輸入Pin又有輸出Pin的Filter為Transform Filter;僅有輸入Pin,沒有輸出Pin的Filter為Rendering Filter。源過濾器輸出引腳輸入引腳轉(zhuǎn)換過濾器輸出引腳輸入引腳提交過濾器圖2.2 Filter通過Pin連接2.2.4 Filter Graph在Direc

24、tShow中,一個播放程序必需實例化一個或多個過濾器,并把它們連接起來。這樣數(shù)據(jù)才能從一個過濾器到達另一個,經(jīng)過它們的處理,直到表現(xiàn)過濾器。所有這些過濾器和它們之間的連接被稱為過濾器圖(Filter Graph)。2.2.5 Filter Graph ManagerFilter Graph Manager 過濾器鏈表管理器為DirectShow結(jié)構(gòu)的核心,是在過濾器鏈表中管理各過濾器的COM對象。主要有以下的功能:1 協(xié)調(diào)Filter之間的狀態(tài)改變: Graph中的Filter的狀態(tài)改變應(yīng)該一致,因此,應(yīng)用程序并將狀態(tài)改變的命令直接發(fā)給Filter,而是將相應(yīng)的狀態(tài)改變的命令發(fā)送給Filter

25、 graph Manager,由manager 將命令分發(fā)給Graph中每一個Filter。2 建立參考時鐘: Graph中的Filter均采用同一個時鐘參考時鐘(reference clock),來確保所有數(shù)據(jù)流的同步,音頻幀或視頻幀應(yīng)被提交的時間(presentation time)是利用參考時鐘確定的。Filter graph Manager 應(yīng)該選擇一個可參考的時鐘,可選擇聲卡上的時鐘,亦可選系統(tǒng)時鐘。3 將Graph的消息返回于應(yīng)用程序:Graph管理器用事件機制把Graph中發(fā)生的事件通知給應(yīng)用程序,此機制和Windows 的消息循環(huán)機制類似。4 提供方法構(gòu)建Filter Grap

26、h :Graph 管理器給應(yīng)用程序提供將Filter 添加進Graph的方法,斷開Filter連接的方法,連接Filter的方法。但是,Graph管理器沒有提供如何將數(shù)據(jù)從一個Filter發(fā)送到另一個Filter的方法,這個工作是由Filter在內(nèi)部通過Pin來獨立完成的。2.2.6 Filter Graph中的數(shù)據(jù)流動當用戶要創(chuàng)建自定義的過濾器時,需了解媒體數(shù)據(jù)是如何在過濾器圖表中傳輸?shù)?。為了在過濾器圖標中傳送媒體數(shù)據(jù),Directshow過濾器需支持傳輸協(xié)議。連接的過濾器須支持相同的傳輸相同傳輸協(xié)議,否則不能交換媒體數(shù)據(jù)。絕大多數(shù)的Directshow過濾器會把媒體的數(shù)據(jù)保存于主存儲器里,

27、且通過Pin把數(shù)據(jù)提交給其他的過濾器,這種傳輸被稱作局部的存儲器傳輸。但并不是所有的過濾器均用局部的存儲器傳輸,例如有的過濾器用硬件傳送媒體的數(shù)據(jù),而引腳只是來提交所控制的信息。Directshow給局部的存儲器傳輸定義了兩種機制,分別是推模式和拉模式:在推模式里,將源過濾器生成數(shù)據(jù)提交給下級過濾器。下級過濾器被動地接受數(shù)據(jù),完成數(shù)據(jù)處理之后再傳送給下級過濾器。在拉模式里,源過濾器和分析過濾器相連。分析過濾器向源過濾器請求數(shù)據(jù)之后,源過濾器則傳送數(shù)據(jù)來響應(yīng)請求。2.3 Directshow事件交互DirectShow應(yīng)該有一種機制,能夠讓應(yīng)用程序與Filter Graph Manager之間實

28、現(xiàn)交互控制。常見事件有:EC_COMPLETE,表示Filter Graph中所有的數(shù)據(jù)都已經(jīng)回放完畢;EC_ERRORABORT,表示Filter Graph運行時出錯;EC_DEVICE_LOST,表示熱插拔設(shè)備脫離系統(tǒng);EC_REPAINT,表示視頻窗口要求重畫當前圖像幀。事件處理機制:Filter Graph Manager上有3種接口和事件的通知有關(guān),即IMediaEventSink,IMediaEvent和IMediaEventEx.IMediaEventSink:用在Filter內(nèi)部,其接口方法Notify用于向Filter Graph Manager發(fā)送事件的通知;IMedia

29、Event:應(yīng)用程序就利用它的接口方法處理Filter Graph Manager發(fā)出來的事件;IMediaEventEx:IMediaEvent接口擴展,支持當Filter Graph Manager 發(fā)出事件時,用窗口消息的方式來通知應(yīng)用程序。事件處理大致的過程如下:一.Filter Graph中的Filter發(fā)出事件后,接收者是Filter Graph Manager;二.Filter Graph Manager對一些特殊事件擁有默認處理的方法。接到事件之后,或按照默認的方法進行直接處理,或放至事件隊列,等候上層應(yīng)用程序的處理;三.應(yīng)用程序獲知Filter Graph Manager有事

30、件發(fā)出后,則可使用IMediaEventEx接口方法到事件隊列里讀取事件,之后依據(jù)事件的類型作相應(yīng)的處理.那么,應(yīng)用程序是怎么知道Filter Graph Manager的事件隊列里有事件在等待處理?有兩種辦法:一種是Filter Graph Manager通過發(fā)送指定的窗口消息來通知應(yīng)用程序,另一種通過事件來同步對象。一種:/自定義一個消息,然后調(diào)用IMediaEventEx:SetNotifyWindow將其設(shè)置給Filter Graph Manager#define WM_GRAPHNOTIFY (WM_APP+100)IMediaEventEx *pEvent=NULL;hr=pGra

31、ph-QueryInterface(IID_IMediaEventEx,(void*)&pEvent);hr=pEvent-SetNotifyWindow(DAHWND)m_hwnd,WM_GRAPHNOTIFY,0);/定義消息映射ON_MESSAGE(WM_GRAPHNOTIFY,OnGraphNotify)/在消息響應(yīng)函數(shù)中獲取Filter Graph的事件通知,并作出相應(yīng)處理,void CNotifyWnd:OnGraphNotify(WPARAM inWParam,LPARAM inLParam)if(pEvent)LONG eventCode=0,eventParam1=0,eve

32、ntParam2=0;while(SUCCEEDED(pEvent-GetEvent(&eventCode,&eventParam1,eventParam2);switch(eventCode)case EC_COMPLETE:break;case EC_USERABORT:break;case EC_ERRORABORT:break;default:break;第二種在Filter Graph Manager在內(nèi)部創(chuàng)建了一個事件同步對象,它在事件隊列中有尚未處理的事件時,狀態(tài)標記為有效,而當應(yīng)用程序不斷調(diào)用接口方法取空事件狀態(tài)復(fù)位。我們可以通過IMediaEvent:GetEventHand

33、le來得到這個事件同步對象的句柄。HANDLE hEvent;long evCode,param1,param2;BOOLEAN bDone=FALSE;HRESULT hr=S_OK;hr=pEvent-GetEventHandle(OAEVENT*)&hEvent);while(!bDone)if(WAIT_OBJECT_0=WaitForSingleObject(hEvent,100)while(hr=pEvent-GetEvent(&evCode,¶m1,¶m2,0),SUCCEEDED(hr)printf(Event code:%#04xn Params:%d,%dn

34、,evCode,param1,param2);hr=pEvent-FreeEventParams(evCode,param1,param2);bDone=(EC_COMPLETE=evCode);2.4 基于DirectShow的應(yīng)用程序開發(fā)基于DirectShow的應(yīng)用程序開發(fā)一般過程如圖所示:應(yīng)用程序濾波圖標管理器應(yīng)用程序濾波圖標管理器應(yīng)用程序濾波圖標管理器方法調(diào)用事件圖2.3 基于DirectShow的應(yīng)用程序開發(fā)過程第一階段,創(chuàng)建一個Filter Graph Manager組件。第二階段,根據(jù)實際的應(yīng)用,創(chuàng)建一條完整的Filter鏈路。第三階段,調(diào)用Filter Graph Manag

35、er上(或直接在某個Filter上)的各個接口方法進行控制,并且完成Filter Graph Manager與應(yīng)用程序的事件交互。2.5播放媒體文件DirectShow提供了大量的Filter用以支持最基本的應(yīng)用。根據(jù)實際需要,也可以定制一個自己的Filter。它的最基本應(yīng)用為回放媒體文件。如下圖是一個AVI文件的回放鏈路。默認的音頻裝置硬盤文件源AVI splitterAVI 解壓處理視頻輸出顯卡聲卡圖2.4 本地AVI格式文件回放的鏈路其中,箭頭的方向即是數(shù)據(jù)的方向。Filter Source屬于Source Filters,它用來管理硬盤里指定播放的文件,并依據(jù)AVI Splitter要

36、求提供相應(yīng)數(shù)據(jù)。AVI Splitter與AVI解壓處理屬于Transform Filters,其中,AVI Splitter負責(zé)向Filter Source索取數(shù)據(jù),并將取得的音頻和視頻進行分離,然后分別從各自的輸出pin輸出:AVI 解壓處理負責(zé)視頻的解碼。Video Renderer和默認的音頻裝置負責(zé)同步播放聲音6。3.多媒體播放器的設(shè)計3.1系統(tǒng)功能設(shè)計3.1.1媒體文件添加系統(tǒng)的輸入數(shù)據(jù)來源于用戶打開讀取媒體文件,包含打開單個媒體文件和文件夾兩個選擇。3.1.2媒體文件存儲和顯示系統(tǒng)得到輸入數(shù)據(jù)后,對它們進行存儲和顯示,為后續(xù)播放、控制操作奠定基礎(chǔ)。3.1.3媒體文件播放及控制已知

37、媒體文件存儲信息的基礎(chǔ)上,執(zhí)行源濾波器-分解濾波器-音/視頻解碼濾波器-音/視頻播放濾波器-數(shù)據(jù)輸出(音視頻設(shè)備)流程以及對整個過程的控制。3.2系統(tǒng)結(jié)構(gòu)設(shè)計此軟件的整體結(jié)構(gòu)設(shè)計如下圖所示:視頻播放器媒體文件功能播播放器基本功能全屏功能截圖功能聲音控制功能播放進度控制功能播放暫停停止圖3.1 系統(tǒng)整體結(jié)構(gòu)3.3 播放器濾波器鏈表結(jié)構(gòu)設(shè)計視頻解碼轉(zhuǎn)換濾波器視頻播放濾波器源過濾器分解過濾器緩沖區(qū)音頻解碼轉(zhuǎn)換濾波器音頻播放濾波器圖3.2播放器的濾波器鏈表結(jié)構(gòu)3.4播放視頻文件的流程CoCreateInstance(,pGraph)pGraph-QueryInterface(,pMediaContro

38、l)pGraph-QueryInterface(,pMediaEvent)pGraph-RenderFile(xxx.mkv)pMediaControl-Run()pMediaEvent-WaitForCompletion()CoUninitialize()CoInitialize()圖3.3 播放視頻文件的流程 流程圖中關(guān)鍵函數(shù)的作用如下所示。CoInitialize():初始化COM運行環(huán)境;CoCreateInstance(,pGraph):用指定的類標識符創(chuàng)建一個Com對象。在該播放器中類標識符為“CLSID_FilterGraph”,用于創(chuàng)建IGraphBuilder。pGraph-

39、QueryInterface(,pMediaControl):通過QueryInterface()查詢某個組件是否支持某個特定的接口。在這里查詢IMediaControl接口。pGraph-QueryInterface(,pMediaEvent):同上。在這里查詢IMediaEvent接口。pGraph-RenderFile(xxx.mkv):為指定的文件智能的構(gòu)建一個Filter Graph。pMediaControl-Run():開始運行Filter Graph中所有的Filter。pMediaEvent-WaitForCompletion():等待Filter Graph處理完所有數(shù)據(jù)。

40、CoUninitialize():釋放CoInitialize()初始化的COM運行環(huán)境7。3.5 Directshow智能連接3.5.1智能連接概述智能連接是濾波器鏈表管理器用以構(gòu)建濾波器鏈表的機制,它包含了一系列選擇濾波器和將其添加到鏈表中去的算法。本軟件即采用此方法構(gòu)建供數(shù)據(jù)流傳輸?shù)臑V波器鏈表。3.5.2智能連接的實現(xiàn)智能連接的基本方法為試連接,它首先用內(nèi)存中的Filter試連接,若不成功,則對當前的Filter Graph中還沒有完全連接的Filter進行試連接。如果不行,再從系統(tǒng)Filter里選取匹配的、最合適的Filter進行試連,直到連接成功。若找不到合適的Filter,則失敗返

41、回。所以只要Filter Graph中有不同類型的、可接受同一媒體類型的Filter,則采用智能連接,每個Filter都可連在正確的位置。為什么在智能連接中不同類型的Filter會連在各自的位置上呢?因為這些Filter能接受的媒體類型不同。從源Filter出來的數(shù)據(jù)流只帶有編碼格式信息,其他信息都是未知的,所以音視頻解碼Filter和處理Filter都不能用,只能使用分離Filter匹配這種媒體類型,所以只會試連接分離Filter。而從分離Filter出來的數(shù)據(jù)分為音、視頻兩路,每路的數(shù)據(jù)流都加上了音頻或者視頻的信息,但沒有標明這是何種音頻或視頻的信息,所以可以被音視頻解碼器Filter接受

42、,但不能被音視頻處理Filter接受。而從音視頻解碼Filter出來的數(shù)據(jù)流帶上了具體格式的音視頻媒體類型的信息,所以能被音視頻處理Filter接受,最后發(fā)送到提交過濾器8。4.視頻播放器的開發(fā)4.1開發(fā)環(huán)境的配置選擇Microsoft DirectX 9.0 SDK (Summer 2004)和Microsoft Visual C+ 6.0作為Directshow播放器的開發(fā)平臺。(1)下載靜態(tài)庫strmbasd.lib并復(fù)制到C:Program FilesMicrosoft DirectX 9.0 SDK (Summer 2004)Lib路徑下。(2) 使用_stdcall函數(shù)調(diào)用協(xié)議和多

43、線程c語言的運行時庫,即在VC菜單里選擇Project|Settings|C/C+,在彈出對話框中Category中選擇Code generation,再在Calling convention中選擇_stdcal l,Use run-time library選擇Debug Multithreaded Dll。(3)配置必要鏈接庫的文件,即在Visual C+的菜單里選擇Project|Settings|Link,在彈出對話框中Category中選擇General,再在Object/library modules輸入strmbasd.lib uuid.lib winmm.lib。(4)確認Dir

44、ect SDK的include目錄和lib目錄都已經(jīng)加入到VC的系統(tǒng)編譯環(huán)境,選擇Tools|Options|directions,選擇include files目錄,加入如下路徑:(a)屬性頁(b)可執(zhí)行目錄配置圖4.1 VC中路徑配置4.2基于對話框的MFC應(yīng)用程序使用VC的項目向?qū)梢粋€基于對話框的MFC應(yīng)用程序,項目名稱為MediaPlayer,并在CMediaPlayerApp中添加COM庫初始化、反初始化代碼:BOOL CMediaPlayerApp:InitInstance()CoInitialize(NULL);/COM庫初始化CSimplePlayerDlg dlg;m_p

45、MainWnd = &dlg;int nResponse = dlg.DoModal();int CSimplePlayerApp:ExitInstance()CoUninitialize();/COM庫反初始化return CWinApp:ExitInstance();4.3 編輯對話框界面在資源編輯器中編輯主對話框界面,如下圖:圖4.2 播放器界面設(shè)計4.4.視頻窗口控制定義一個視頻窗口的控制對象:CStatic mVideoWindow ; 在主對話框的初始化函數(shù)OnInitDialog中增加修改視頻窗口的函數(shù)mVideoWindow.ModifyStyle(0,WS_CLIPCHILD

46、REN);并添加WM_ERASEBKGND消息響應(yīng)9。代碼如下:BOOL CMediaPlayerDlg:OnEraseBkgnd(CDC* pDC)/為視頻窗口擦除背景,否則當被其他窗口遮蔽后會變成默認的灰色CRect rc;mVideoWindow.GetWindowRect(&rc);/獲得窗口的矩形邊界ScreenToClient(&rc);pDC-ExcludeClipRect(&rc);/排除被視頻窗口覆蓋的裁剪區(qū)域return CDialog:OnEraseBkgnd(pDC);/擦除對話框剩下的區(qū)域4.5封裝CDXGraphDirectShow是基于COM組件的開發(fā)包,所以此在

47、應(yīng)用程序的最開始應(yīng)該初始化COM庫環(huán)境。 實現(xiàn)為:在應(yīng)用程序?qū)ο驧ediaPlayerApp的InitInstance函數(shù)中調(diào)用AfxOleInit()或者CoInitialize(NULL)函數(shù)。Directshow SDK是一個庫函數(shù),在使用時需要遵循先創(chuàng)建、再使用、后銷毀的原則。媒體的播放和圖像顯示等功能都是由SDK來完成的。為了系統(tǒng)開發(fā)方便,通常把與SDK有關(guān)的開發(fā)函數(shù)封裝在CDXGraph中去。這樣應(yīng)用程序可以使用其中的成員函數(shù)和變量來完成媒體的播放與顯示。該類中包含了回放媒體時所需要的幾乎所有的動作和控制方法,也包括Filter Graph Manager的創(chuàng)建及其各種控制接口等,

48、在主對話框類中,定義一個CDXGraph的指針:CDXGraph*mFilterGraph;4.6.創(chuàng)建Filter Graph在此需要首先創(chuàng)建濾波器鏈表管理器,然后在該鏈表下查詢、使用各個接口。根據(jù)用戶選擇的源文件,創(chuàng)建相應(yīng)的回放Filter Graph,代碼如下:void CMediaPlayerDlg:DestroyGraph(void)if (mFilterGraph)mFilterGraph-Stop();/ 停止濾器圖表mFilterGraph-SetNotifyWindow(NULL);/窗口消息處理delete mFilterGraph;mFilterGraph = NULL;

49、void CMediaPlayerDlg:CreateGraph(void)DestroyGraph();/確保mFilterGraph為空mFilterGraph = new CDXGraph();/新建Filter Graphif (mFilterGraph-Create()/創(chuàng)建Filter Graph ManagermFilterGraph-RenderFile(mSourceFile); / 獲取源數(shù)據(jù)mFilterGraph-SetDisplayWindow(mVideoWindow.GetSafeHwnd();/設(shè)置顯示窗口mFilterGraph-SetNotifyWindow

50、(this-GetSafeHwnd();/窗口消息處理mFilterGraph-Pause();/顯示第一幀4.7創(chuàng)建播放主題4.7.1 打開按鈕響應(yīng)函數(shù)單擊播放器界面中的“打開”按鈕后,即可打開要播放的媒體文件,此處需要添加一個鼠標單擊事件響應(yīng)。代碼如下:void CMediaPlayerDlg:OnButtonOpen()CString strFilter = AVI File (*.avi)|*.avi|;/打開文件類型提示strFilter += MPEG File (*.mpg;*.mpeg)|*.mpg;*.mpeg|;strFilter += Wave File (*.wav)|

51、*.wav|;strFilter += All Files (*.*)|*.*|;CfileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this); /打開文件對話框if (IDOK = dlgOpen.DoModal()mSourceFile = dlgOpen.GetPathName();CreateGraph();/創(chuàng)建相應(yīng)的回放Filter Graph4.7.2渲染渲染媒體文件,把顯示圖像窗口和Directshow SDK的視頻窗口接口進行捆綁。因為所有對Direct

52、show SDK的控制是在封裝類CDXGraph中實現(xiàn)的,所以首先要創(chuàng)建一個CDXGraph對象; 然后創(chuàng)建濾波器鏈表管理器,并把讀取的文件的路徑名改為寬字符形式。渲染媒體文件,自動剖析媒體格式,構(gòu)建濾波器列表。如果渲染成功,則設(shè)置圖像顯示窗口并注冊消息通知窗口;最后顯示第一幀圖像后,馬上暫停。具體代碼如下:void CMediaPlayerDlg:CreateGraph()DestroyGraph(); /銷毀濾波器鏈表圖m_pFilterGraph = new CDXGraph(); /創(chuàng)建CDXGraph對象if (m_pFilterGraph-Create() /創(chuàng)建濾波器鏈表管理器/

53、if (!m_pFilterGraph-RenderFile(ch)/渲染媒體文件,構(gòu)建濾波器鏈表括TCHAR *ch1 = m_sourceFile.GetBuffer(m_sourceFile.GetLength();if (!m_pFilterGraph-RenderFile(ch1)/渲染媒體文件?構(gòu)建濾波器鏈,MessageBox(_T(無法渲染此媒體文件!請確認是否安裝相關(guān)解碼器插件!n 或者此媒體文件已損壞!),_T( (系統(tǒng)提示),MB_ICONWARNING);return;m_sourceFile.ReleaseBuffer();/設(shè)置圖像顯示窗口m_pFilterGrap

54、h-SetDisplayWindow(m_videoWindow.GetSafeHwnd();/設(shè)置窗口消息通知m_pFilterGraph-SetNotifyWindow(this-GetSafeHwnd();/顯示第一幀圖像m_pFilterGraph-Pause();4.7.3播放按鈕響應(yīng)函數(shù)單擊“播放”按鈕后開始播放選擇的媒體文件,同時在標題欄中顯示播放速度和媒體文件名。具體代碼如下:void CMediaPlayerDlg:OnButtonPlay()if (mFilterGraph)mFilterGraph-Run();/運行圖表if (mSliderTimer = 0)mSlid

55、erTimer = SetTimer(SLIDER_TIMER, 100, NULL);/設(shè)置計時器為了獲取媒體播放的信息和各種事件。需要向窗口發(fā)送通知,具體步驟如下。向?qū)υ捒蝾愔刑砑幼远x的消息處理函數(shù)OnGrsphNotify:afx_msg LRESULT OnGraphNotify(WPARAM inWParam, LPARAM inLParam);向?qū)υ捒蛳⒂成洳糠痔砑酉⒂成浜?ON_MESSAGE(WM_GRAPHNOTIFY, OnGraphNotify)消息處理函數(shù)OnGraphNotify的具體實現(xiàn)代碼如下:LRESULT CMediaPlayerDlg:OnGraphN

56、otify(WPARAM inWParam, LPARAM inLParam)IMediaEventEx *pEvent = NULL;if (m_pFilterGraph!=NULL) & (pEvent = m_pFilterGraph-GetEventHandle()LONG eventCode = 0;LONG eventParam1 = 0;LONG eventParam2 = 0;while (SUCCEEDED(pEvent-GetEvent(&eventCode, &eventParam1, &eventParam2, 0)pEvent-FreeEventParams(eventCode, eventParam1, eventParam2);switch (eventCode)case EC_COMPLETE:OnBnClickedButtonPause();m_pFilterGraph-SetCurrentPosition(0);break;case EC_USERABORT:case EC_ERRORA

展開閱讀全文
溫馨提示:
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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!