在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn)
《在線視頻播放系統(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)教師
2、 李菊葉 完成地點 物電學(xué)院計算機信息處理分室 2016 年 6 月 5 日 專心---專注---專業(yè) 畢業(yè)論文﹙設(shè)計﹚任務(wù)書 院(系) 物電學(xué)院 專業(yè)班級 電子信息工程 學(xué)生姓名 ?崔媛媛 一、畢業(yè)論文﹙設(shè)計﹚題目 在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn) 二、畢業(yè)論文﹙設(shè)計﹚工作自 20
3、16 年 3 月 10 日 起至 2016 年 6 月 20 日止 三、畢業(yè)論文﹙設(shè)計﹚進(jìn)行地點: 物電學(xué)院計算機信息處理分室 四、畢業(yè)論文﹙設(shè)計﹚的內(nèi)容要求: 隨著網(wǎng)絡(luò)的普及,在線播放器也日益普及起來。本設(shè)計要求學(xué)生利用Visual C++為開發(fā)工具,使用DirectShow SDK技術(shù)開發(fā)一個功能齊全的視頻播放器,要求能夠?qū)τ脖P或存儲設(shè)備上的多媒體文件進(jìn)行播放,及在回放或顯示過程中,用戶可以控制回放的動作和顯示特性等相關(guān)功能。
4、 五、 畢業(yè)論文﹙設(shè)計﹚應(yīng)收集資料及參考文獻(xiàn): [1]徐孝凱,張紀(jì)勇.C++面向?qū)ο蟪绦蛟O(shè)計:VC++6.0運行環(huán)境[M].天津大學(xué)出版社2009. [2]汪曉平,鐘軍.VC++網(wǎng)絡(luò)通信協(xié)議
5、分析與應(yīng)用實現(xiàn)[M].北京:人民郵電出版社,2003. [3]王艷平,張越.Windows網(wǎng)絡(luò)與通信程序設(shè)計[M].北京:人民郵電出版社,2006. [4] Andrew S.Tanenbau.計算機網(wǎng)絡(luò)(第四版)[M].北京:清華大學(xué)出版社,2004. [5]謝希仁.計算機網(wǎng)絡(luò)(第五版)[M].北京:電子工業(yè)出版社,2012. [6]朱桂英.張元亮 Visual C++網(wǎng)絡(luò)編程開發(fā)與實踐[M].清華大學(xué)出版社.201
6、3. 六、 畢業(yè)論文﹙設(shè)計﹚的進(jìn)度安排: 3月2日——3月29日:查閱資料,完成初步設(shè)計方案和開題報告。 4月1日——4月26日:根據(jù)視頻播放系統(tǒng)的工作原理,給出設(shè)計方案,及軟件流程圖。 4月29日——5月24:并在軟件環(huán)境下進(jìn)行
7、運行調(diào)試,進(jìn)一步完善系統(tǒng)功能,整理資料; 5月27日——6月7日:撰寫、修改畢業(yè)設(shè)計論文。 6月10日——6月15日:打印論文準(zhǔn)備并完成答辯。 指導(dǎo)教師簽名 系(教研室)主任簽名
8、 專業(yè)負(fù)責(zé)人簽名 批準(zhǔn)日期 在線視頻播放系統(tǒng)的實現(xiàn)與設(shè)計 崔媛媛 (陜西理工學(xué)院物理與電信工程學(xué)院電子信息工程專業(yè),2012級2班,陜西 漢中 ) 指導(dǎo)教師:李菊葉 [摘要]本設(shè)計在Visual C++環(huán)境下,利用MFC程序設(shè)計方法。并利用DirectShow的播放器核心技術(shù),重點實現(xiàn)了播放、暫停、停止 、聲音控制、進(jìn)度控制、抓取視頻幀、播放模式控制、全屏等功能。通過對系統(tǒng)的需求分析、設(shè)
9、計、實現(xiàn),完成了多媒體播放器系統(tǒng),各項功能使用正常,并給出了實現(xiàn)關(guān)鍵代碼。DirectShow是基于COM組件,它是二進(jìn)制級別的(不受限于編程語言和操作系統(tǒng)),具有很好的兼容性和移植性。 [關(guān)鍵字]Visual C++;MFC;DirectShow;播放器 The design and implement of online video broadcast system Cui Yuanyuan (Grade12,Class02,Major electronics and informa
10、tion engineering,School of Physics and Telecommunication Engineering,Shaanxi University of Technology,Hanzhong ,Shaanxi) Tutor:Li Juye Abstract:This design uses MFC program design methods Under Visual C++ environment. At the same time,uses DirectShow player core technology. Focus to achieve the
11、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, completed a media player system, various functions normal use, and gives the realization key code.DirectShow
12、 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 目錄
13、 1.引言 隨著社會的發(fā)展,信息技術(shù)越來越發(fā)達(dá),在線視頻播放器在未來社會應(yīng)用也會越來越普遍。Microsoft的Windows操作系統(tǒng)作為全球最主流、最常用的操作系統(tǒng),掌握在它上面的多媒體開發(fā)技術(shù)顯得越來越需要,相對于其他多媒體開發(fā)技術(shù),掌握它本身提供的DirectX多媒體開發(fā)包顯得更為適合。 DirectShow是微軟提供的多媒體開發(fā)包DirectX中的一部分,它是建立在DirectDraw和DirectSound基礎(chǔ)之上。 Microsoft給DirectS
14、how程序員提供了一套開發(fā)多媒體標(biāo)準(zhǔn)的、統(tǒng)一的、高效的API接口,這些接口使得多媒體數(shù)據(jù)的回放變得簡單,剝離了應(yīng)用程序和硬件底層的差異性。而DirectShow是基于COM組件的開發(fā)包,COM是基于二進(jìn)制代碼級的協(xié)議(與編程語言無關(guān)的協(xié)議),對使用DirectShow開發(fā)的軟件以后的移植和兼容問題提供了良好的解決方案。 DirectShow使用智能連接開發(fā)多媒體應(yīng)用程序,大大簡化了開發(fā)人員工作量,同時開發(fā)人員亦可開發(fā)自定義的濾波器。使得基于DirectShow的應(yīng)用程序可以充分滿足不同用戶的需求。在未來幾年中,DirectShow技術(shù)的發(fā)展前景將是非常廣闊的。 1.1背景 當(dāng)今信息技術(shù)越
15、來越發(fā)達(dá),社會越來越信息化、智能化,多媒體在未來社會應(yīng)用越來越廣泛。Microsoft的Windows操作系統(tǒng)作為全球最主流、最常用的操作系統(tǒng),掌握在它上面的多媒體開發(fā)技術(shù)顯得越來越需要,相對于其他多媒體開發(fā)技術(shù),掌握它本身提供的DirectX多媒體開發(fā)包顯得更為適合。 1.2 研究目的 DirectShow是微軟提供的多媒體開發(fā)包DirectX中的一部分,它是建立在DirectDraw和DirectSound基礎(chǔ)之上。 Microsoft給DirectShow程序員提供了一套開發(fā)多媒體標(biāo)準(zhǔn)的、統(tǒng)一的、高效的API接口,這些接口使得多媒體數(shù)據(jù)的回放變得簡單,剝離了應(yīng)用程序和硬件底層的差異
16、性。而DirectShow是基于COM組件的開發(fā)包,COM是基于二進(jìn)制代碼級的協(xié)議(與編程語言無關(guān)的協(xié)議),對使用DirectShow開發(fā)的軟件以后的移植和兼容問題提供了良好的解決方案。 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)境下
17、進(jìn)行視頻播放器的開發(fā)。 1.3.1 VC++2010平臺 Microsoft ,(簡稱Visual C++、MSVC、VC++或VC)C++語言開發(fā)工具,一個,能夠提供編輯C語言,C++以及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)支持
18、各個數(shù)據(jù)庫的接口、OLE2、WinSock網(wǎng)絡(luò)和3D控制界面 1.3.2 MFC概述 MFC(Microsoft Foundation Classes)是微軟公司所提供的類型庫(class libraries),以C++類的方式封裝了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)建指定的類的對象。比如視對象、框架的窗口對象等等,比如文檔對象需由文檔模版類對象進(jìn)行動態(tài)的創(chuàng)建。 (3
19、)串行化 盡管程序中有著各種數(shù)據(jù),串行化機制也如流水般按照順序儲存置于單一文件里,并且也能按照順序取出,成為不同對象的數(shù)據(jù)。 (4)消息映射和傳遞 MFC把SDK編程中對消息的產(chǎn)生、傳遞、到過程函數(shù)中響應(yīng)的過程封裝起來,形成消息映射宏、消息映射表和消息響應(yīng)函數(shù)體系,更加直觀和便于操作[2]。 2. DirectShow介紹 2.1 DirectShow系統(tǒng) DirectShow是新一代基于COM的流媒體處理的開發(fā)包,是微軟公司在ActiveMo
20、vie和Video for Windows的基礎(chǔ)上推出的,與DirectX開發(fā)包共同發(fā)布。Directshow為多媒體的回放和捕捉提供了有力強大的支持。應(yīng)用DirectShow,能方便地在支持WDM中捕獲數(shù)據(jù),且后期進(jìn)行一些相應(yīng)處理乃至儲存到文件里。這樣在多媒體的數(shù)據(jù)庫管理系統(tǒng)里多媒體的數(shù)據(jù)存取就會更加方便。 它的架構(gòu)如圖1所示。圖中央即是DirectShow系統(tǒng),虛線下面是Ring 0特權(quán)級硬件設(shè)備,虛線上面是Ring 3特權(quán)級的應(yīng)用層。DirectShow系統(tǒng)處于應(yīng)用層。它用Filter Graph模型來管理整體數(shù)據(jù)流的處理。參與數(shù)據(jù)的處理的各功能模塊稱做Filter;各個Filter在
21、Filter Graph中按相應(yīng)順序連成一條“流水線”協(xié)調(diào)工作[3]。 事件 Directshow 文件系統(tǒng) Rendering Filters 命令 文件系統(tǒng) 因特網(wǎng) VFW 采集設(shè)備 內(nèi)核流架構(gòu) WDM采集 MPEG2硬件解碼器 ACM/VCM編解碼器 顯卡 DirectDraw 應(yīng)用程序 Filter Graph Manager Source Filters TransformFilters 聲卡 DirectSound 圖2.1 DirectShow架
22、構(gòu) 2.2 DirectShow技術(shù) 2.2.1 過濾器 過濾器是DirectShow 的基本組成單元。DirectShow把數(shù)字媒體的處理(播放、捕獲和格式轉(zhuǎn)換)劃分為一些獨立的步驟,過濾器就是完成一個或多個步驟的COM 對象。DirectShow提供了一組標(biāo)準(zhǔn)的過濾器供應(yīng)用程序使用,程序開發(fā)者也可以創(chuàng)建自定義的過濾器來擴(kuò)充Directshow的功能,但必須是以COM形式建立的[4]。 按照功能來分,F(xiàn)ilter大致分為3類:Source Filter、Transform Filter和Rendering Filter。 所有能生成流的DS filter都可以認(rèn)為是Source f
23、ilter。這個流可以源自硬盤上的文件,也可以是實時設(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章詳細(xì)描述了源filter的設(shè)計實現(xiàn)。 Transform Filter是DS著墨最多的工作。轉(zhuǎn)換filter從其
24、它filter(可能是源filter)接收一個輸入流,對流執(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可以將流寫到文件
25、。而其它的渲染filter可以將音頻流發(fā)送到揚聲器,或?qū)⒁曨l流發(fā)送到桌面上的窗口。DirectShow中的Direct反映的是:使用DirectDraw和DirectSound的渲染filter支持將它的流高效傳輸給顯卡和聲卡的技術(shù)。這個能力意味著DS的渲染filter能進(jìn)行快速且無關(guān)用戶-內(nèi)核模式的傳輸。(對于OS來說,這個處理意味著將數(shù)據(jù)從用戶層傳輸?shù)絻?nèi)核層)。 一個filter graph可以有多個渲染filter。如使用一個多通管道將一路視頻流送到一個渲染filter以生成文件,另一路則將它送到另一個渲染filter以用于顯示。從而可以實現(xiàn)監(jiān)視視頻的同時寫文件。 簡單來說,Sour
26、ce Filter主要負(fù)責(zé)獲取數(shù)據(jù),數(shù)據(jù)源可以是文件、因特網(wǎng)計算機里的采集卡(WDM驅(qū)動的或VFW驅(qū)動的)數(shù)字?jǐn)z像機等,然后將數(shù)據(jù)往下傳輸;Transform Filter主要負(fù)責(zé)數(shù)據(jù)的格式轉(zhuǎn)換,例如數(shù)據(jù)流分離、合成,解碼、編碼等,然后將數(shù)據(jù)繼續(xù)往下傳輸;Rendering Filter主要負(fù)責(zé)數(shù)據(jù)的最終去向——將數(shù)據(jù)送給顯卡、聲卡進(jìn)行多媒體的演示,或者輸出到文件進(jìn)行存儲。 2.2.2 COM組件 Directshow是基于COM的流媒體處理的開發(fā)包。COM是一種跨應(yīng)用和語言共享的二 進(jìn)制代碼的方法,它是一個開放的組件標(biāo)準(zhǔn),具有很強的擴(kuò)展與擴(kuò)充能力[5]。優(yōu)點如下: (1) 可以方便的
27、將應(yīng)用系統(tǒng)擴(kuò)展至網(wǎng)絡(luò)環(huán)境; (2) 可以將系統(tǒng)中的組件用新的代替掉,以方便隨時進(jìn)行系統(tǒng)的升級和定制; (3) 可以在多個應(yīng)用系統(tǒng)中多次利用同一個組件; (4) COM組件與語言和平臺無關(guān)。 2.2.3針腳Pin 過濾器能和一個或者多個過濾器相連,連接接口是COM形式,叫引腳。過濾器用引腳在各過濾器之間傳輸各種數(shù)據(jù)。每個引腳都是從IPin這個COM對象派生出來的。每個引腳都是過濾器私有的對象,過濾器能動態(tài)地創(chuàng)建引腳、銷毀引腳、自由地控制引腳的生存時間。引腳可分為兩種類型:輸出引腳和輸入引腳。相連的兩個引腳須是不同類型的,即輸入引腳只能和輸出引腳相連,并且連接方向常是由輸出引腳指向輸入
28、引腳的。Filter一般由一個或多個Pin組成,F(xiàn)ilter之間通過Pin相互連接,構(gòu)成一條順序的鏈路。Filter的分類亦可根據(jù)Filter包含的輸入Pin或者輸出Pin的數(shù)量進(jìn)行。 過濾器間的連接,實質(zhì)上就是連接雙方的媒體類型媒體協(xié)商的過程。連接大致的過程為:若調(diào)用連接函數(shù)的時候已指定完整的媒體類型,那么用此媒體類型進(jìn)行連接,是否成功都要結(jié)束連接進(jìn)程;如不完全指定或沒有指定媒體的類型,就進(jìn)行下面的枚舉過程:枚舉欲連接的輸入引腳上的所有的媒體類型,逐一使用此媒體類型和輸出引腳進(jìn)行連接(如連接函數(shù)提供不完全媒體類型,就要先把每個枚舉出的媒體類型和它進(jìn)行匹配檢查),若輸出引腳也接受此媒體類型,
29、那么引腳間的連接就成功了;如果輸出引腳對全部輸入引腳上所枚舉的媒體類型均不支持,那么就枚舉輸出引腳上的全部媒體類型,且逐一利用這些媒體類型和輸入引腳來進(jìn)行連接,如果輸入引腳接受其中的一種媒體類型,那么引腳間的連接就成功了;如果對輸出引腳上的全部媒體類型輸入引腳均不支持,則這兩個引腳間的連接過程宣告失敗。 如圖2所示,僅含有輸出Pin,沒有輸入Pin的Filter為Source Filter;既有輸入Pin又有輸出Pin的Filter為Transform Filter;僅有輸入Pin,沒有輸出Pin的Filter為Rendering Filter。 源過濾器 輸
30、出引腳 輸入引腳 轉(zhuǎn)換過濾器 輸出引腳 輸入引腳 提交過濾器 圖2.2 Filter通過Pin連接 2.2.4 Filter Graph 在DirectShow中,一個播放程序必需實例化一個或多個過濾器,并把它們連接起來。這樣數(shù)據(jù)才能從一個過濾器到達(dá)另一個,經(jīng)過它們的處理,直到表現(xiàn)過濾器。所有這些過濾器和它們之間的連接被稱為過濾器圖(Filter Graph)。 2.2.5 Filter Graph Manager Filter Graph Manager 過濾器鏈表管理器為DirectShow結(jié)構(gòu)的核心,是在過濾器鏈表中管理各過濾器的COM
31、對象。主要有以下的功能: 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 graph Manager,由manager 將命令分發(fā)給Graph中每一個Filter。 2> 建立參考時鐘: Graph中的Filter均采用同一個時鐘——參考時鐘(reference clock),來確保所有數(shù)據(jù)流的同步,音頻幀或視頻幀應(yīng)被提交的時間(presentation time)是利用參考時鐘確定的。Filter graph Manager 應(yīng)該選擇一個可參考的時鐘,
32、可選擇聲卡上的時鐘,亦可選系統(tǒng)時鐘。 3> 將Graph的消息返回于應(yīng)用程序:Graph管理器用事件機制把Graph中發(fā)生的事件通知給應(yīng)用程序,此機制和Windows 的消息循環(huán)機制類似。 4> 提供方法構(gòu)建Filter Graph :Graph 管理器給應(yīng)用程序提供將Filter 添加進(jìn)Graph的方法,斷開Filter連接的方法,連接Filter的方法。 但是,Graph管理器沒有提供如何將數(shù)據(jù)從一個Filter發(fā)送到另一個Filter的方法,這個工作是由Filter在內(nèi)部通過Pin來獨立完成的。 2.2.6 Filter Graph中的數(shù)據(jù)流動 當(dāng)用戶要創(chuàng)建自定義的過濾器時,需
33、了解媒體數(shù)據(jù)是如何在過濾器圖表中傳輸?shù)?。為了在過濾器圖標(biāo)中傳送媒體數(shù)據(jù),Directshow過濾器需支持傳輸協(xié)議。連接的過濾器須支持相同的傳輸相同傳輸協(xié)議,否則不能交換媒體數(shù)據(jù)。 絕大多數(shù)的Directshow過濾器會把媒體的數(shù)據(jù)保存于主存儲器里,且通過Pin把數(shù)據(jù)提交給其他的過濾器,這種傳輸被稱作局部的存儲器傳輸。但并不是所有的過濾器均用局部的存儲器傳輸,例如有的過濾器用硬件傳送媒體的數(shù)據(jù),而引腳只是來提交所控制的信息。 Directshow給局部的存儲器傳輸定義了兩種機制,分別是推模式和拉模式: 在推模式里,將源過濾器生成數(shù)據(jù)提交給下級過濾器。下級過濾器被動地接受數(shù)據(jù),完成數(shù)據(jù)處理之
34、后再傳送給下級過濾器。 在拉模式里,源過濾器和分析過濾器相連。分析過濾器向源過濾器請求數(shù)據(jù)之后,源過濾器則傳送數(shù)據(jù)來響應(yīng)請求。 2.3 Directshow事件交互 DirectShow應(yīng)該有一種機制,能夠讓應(yīng)用程序與Filter Graph Manager之間實現(xiàn)交互控制。 常見事件有: EC_COMPLETE,表示Filter Graph中所有的數(shù)據(jù)都已經(jīng)回放完畢; EC_ERRORABORT,表示Filter Graph運行時出錯; EC_DEVICE_LOST,表示熱插拔設(shè)備脫離系統(tǒng); EC_REPAINT,表示視頻窗口要求重畫當(dāng)前圖像幀。 事件處理機制:Filter Graph
35、 Manager上有3種接口和事件的通知有關(guān),即 IMediaEventSink,IMediaEvent和IMediaEventEx. IMediaEventSink:用在Filter內(nèi)部,其接口方法Notify用于向Filter Graph Manager發(fā)送事件的通知; IMediaEvent:應(yīng)用程序就利用它的接口方法處理Filter Graph Manager發(fā)出來的事件; IMediaEventEx:IMediaEvent接口擴(kuò)展,支持當(dāng)Filter Graph Manager 發(fā)出事件時,用窗口消息的方式來通知應(yīng)用程序。 事件處理大致的過程如下: 一.Filter Graph中的
36、Filter發(fā)出事件后,接收者是Filter Graph Manager; 二.Filter Graph Manager對一些特殊事件擁有默認(rèn)處理的方法。接到事件之后,或按照默認(rèn)的方法進(jìn)行直接處理,或放至事件隊列,等候上層應(yīng)用程序的處理; 三.應(yīng)用程序獲知Filter Graph Manager有事件發(fā)出后,則可使用IMediaEventEx接口方法到事件隊列里讀取事件,之后依據(jù)事件的類型作相應(yīng)的處理. 那么,應(yīng)用程序是怎么知道Filter Graph Manager的事件隊列里有事件在等待處理? 有兩種辦法:一種是Filter Graph Manager通過發(fā)送指定的窗口消息來通知應(yīng)用程
37、序,另一種通過事件來同步對象。 一種: //自定義一個消息,然后調(diào)用IMediaEventEx::SetNotifyWindow將其設(shè)置給Filter Graph Manager #define WM_GRAPHNOTIFY (WM_APP+100) IMediaEventEx *pEvent=NULL; hr=pGraph->QueryInterface(IID_IMediaEventEx,(void**)&pEvent); hr=pEvent->SetNotifyWindow((DAHWND)m_hwnd,WM_GRAPHNOTIFY,0); //定義消息映射 ON_MESSAGE(WM_
38、GRAPHNOTIFY,OnGraphNotify) //在消息響應(yīng)函數(shù)中獲取Filter Graph的事件通知,并作出相應(yīng)處理, void CNotifyWnd::OnGraphNotify(WPARAM inWParam,LPARAM inLParam) { if(pEvent) { LONG eventCode=0,eventParam1=0,eventParam2=0; while(SUCCEEDED(pEvent->GetEvent(&eventCode,&eventParam1,eventParam2); switch(eventCode) { case
39、EC_COMPLETE: break; case EC_USERABORT: break; case EC_ERRORABORT: break; default: break; } } } 第二種在Filter Graph Manager在內(nèi)部創(chuàng)建了一個事件同步對象,它在事件隊列中有尚未處理的事件時,狀態(tài)標(biāo)記為有效,而當(dāng)應(yīng)用程序不斷調(diào)用接口方法取空事件狀態(tài)復(fù)位。我們可以通過IMediaEvent::GetEventHandle來得到這個事件同步對象的句柄。 HANDLE hEvent; long evCode,param1,param2; BOO
40、LEAN 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:%#04x\n?? Params:%d,%d\n",evCode,param1,param2);
41、hr=pEvent->FreeEventParams(evCode,param1,param2); bDone=(EC_COMPLETE==evCode); } } } 2.4 基于DirectShow的應(yīng)用程序開發(fā) 基于DirectShow的應(yīng)用程序開發(fā)一般過程如圖所示: 應(yīng)用程序 濾波圖標(biāo)管理器 應(yīng)用程序 濾波圖標(biāo)管理器 應(yīng)用程序 濾波圖標(biāo)管理器 方法調(diào)用 事件 圖2.3 基于DirectShow的應(yīng)用程序開發(fā)過程 第一階段,創(chuàng)建一個Filter Graph Manager組件。 第二階段,根據(jù)實際的應(yīng)用,創(chuàng)建一條完整的Filter鏈路
42、。 第三階段,調(diào)用Filter Graph Manager上(或直接在某個Filter上)的各個接口方法進(jìn)行控制,并且完成Filter Graph Manager與應(yīng)用程序的事件交互。 2.5播放媒體文件 DirectShow提供了大量的Filter用以支持最基本的應(yīng)用。根據(jù)實際需要,也可以定制一個自己的Filter。它的最基本應(yīng)用為回放媒體文件。如下圖是一個AVI文件的回放鏈路。 默認(rèn)的音頻裝置 硬盤 文件源 AVI splitter AVI 解壓處理 視頻輸出 顯卡 聲卡 圖2.4 本地AVI格式文件回放的鏈路
43、 其中,箭頭的方向即是數(shù)據(jù)的方向。Filter Source屬于Source Filters,它用來管理硬盤里指定播放的文件,并依據(jù)AVI Splitter要求提供相應(yīng)數(shù)據(jù)。AVI Splitter與AVI解壓處理屬于Transform Filters,其中,AVI Splitter負(fù)責(zé)向Filter Source索取數(shù)據(jù),并將取得的音頻和視頻進(jìn)行分離,然后分別從各自的輸出pin輸出:AVI 解壓處理負(fù)責(zé)視頻的解碼。Video Renderer和默認(rèn)的音頻裝置負(fù)責(zé)同步播放聲音[6]。
44、 3.多媒體播放器的設(shè)計 3.1系統(tǒng)功能設(shè)計 3.1.1媒體文件添加 系統(tǒng)的輸入數(shù)據(jù)來源于用戶打開讀取媒體文件,包含打開單個媒體文件和文件夾兩個選擇。 3.1.2媒體文件存儲和顯示 系統(tǒng)得到輸入數(shù)據(jù)后,對它們進(jìn)行存儲和顯示,為后續(xù)播放、控制操作奠定基礎(chǔ)。 3.1.3媒體文件播放及控制 已知媒體文件存儲信息的基礎(chǔ)上,執(zhí)行源濾波器->分解濾波器->音/視頻解碼濾波器->音/視頻播放濾波器->數(shù)據(jù)輸出(音視頻設(shè)備)流程以及對整個過程的控制。 3.2系統(tǒng)結(jié)構(gòu)設(shè)計 此軟件的整體結(jié)構(gòu)設(shè)計如下圖所示: 視頻播放器 媒體文件功能 播播放器基本功能 全屏功能
45、 截圖功能 聲音控制功能 播放進(jìn)度控制功能 播放 暫停 停止 圖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(…,pMediaControl) pG
46、raph->QueryInterface(…,pMediaEvent) pGraph->RenderFile("xxx.mkv") pMediaControl->Run() pMediaEvent->WaitForCompletion() CoUninitialize() CoInitialize() 圖3.3 播放視頻文件的流程 流程圖中關(guān)鍵函數(shù)的作用如下所示。 CoInitialize():初始化COM運行環(huán)境; CoCreateInstance(…,pGrap
47、h)?:用指定的類標(biāo)識符創(chuàng)建一個Com對象。在該播放器中類標(biāo)識符為“CLSID_FilterGraph”,用于創(chuàng)建IGraphBuilder。? pGraph->QueryInterface(…,pMediaControl):通過QueryInterface()查詢某個組件是否支持某個特定的接口。在這里查詢IMediaControl接口。 pGraph->QueryInterface(…,pMediaEvent)?:同上。在這里查詢IMediaEvent接口。 pGraph->RenderFile("xxx.mkv"):為指定的文件智能的構(gòu)建一個Filter Graph。 pMedia
48、Control->Run()?:開始運行Filter Graph中所有的Filter。 pMediaEvent->WaitForCompletion()?:等待Filter Graph處理完所有數(shù)據(jù)。 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)存中的
49、Filter試連接,若不成功,則對當(dāng)前的Filter Graph中還沒有完全連接的Filter進(jìn)行試連接。如果不行,再從系統(tǒng)Filter里選取匹配的、最合適的Filter進(jìn)行試連,直到連接成功。若找不到合適的Filter,則失敗返回。 所以只要Filter Graph中有不同類型的、可接受同一媒體類型的Filter,則采用智能連接,每個Filter都可連在正確的位置。為什么在智能連接中不同類型的Filter會連在各自的位置上呢?因為這些Filter能接受的媒體類型不同。 從源Filter出來的數(shù)據(jù)流只帶有編碼格式信息,其他信息都是未知的,所以音視頻解碼Filter和處理Filter都不能用
50、,只能使用分離Filter匹配這種媒體類型,所以只會試連接分離Filter。而從分離Filter出來的數(shù)據(jù)分為音、視頻兩路,每路的數(shù)據(jù)流都加上了音頻或者視頻的信息,但沒有標(biāo)明這是何種音頻或視頻的信息,所以可以被音視頻解碼器Filter接受,但不能被音視頻處理Filter接受。而從音視頻解碼Filter出來的數(shù)據(jù)流帶上了具體格式的音視頻媒體類型的信息,所以能被音視頻處理Filter接受,最后發(fā)送到提交過濾器[8]。 4.視頻播放器的開發(fā) 4.1開發(fā)環(huán)境的配置 選擇Microsoft Direct
51、X 9.0 SDK (Summer 2004)和Microsoft Visual C++ 6.0作為Directshow播放器的開發(fā)平臺。 (1)下載靜態(tài)庫strmbasd.lib并復(fù)制到C:\Program Files\Microsoft DirectX 9.0 SDK (Summer 2004)\Lib路徑下。 (2) 使用_stdcall函數(shù)調(diào)用協(xié)議和多線程c語言的運行時庫,即在VC菜單里選擇Project|Settings|C/C++,在彈出對話框中Category中選擇Code generation,再在Calling convention中選擇_stdcal l,Use run
52、-time library選擇Debug Multithreaded Dll。 (3)配置必要鏈接庫的文件,即在Visual C++的菜單里選擇Project|Settings|Link,在彈出對話框中Category中選擇General,再在Object/library modules輸入strmbasd.lib uuid.lib winmm.lib。 (4)確認(rèn)Direct SDK的include目錄和lib目錄都已經(jīng)加入到VC的系統(tǒng)編譯環(huán)境,選擇Tools|Options|directions,選擇include files目錄,加入如下路徑: (a)屬性頁 (b)可執(zhí)行
53、目錄配置 圖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_pMainWnd = &dlg; int nResponse = dlg.DoModal(); …… } int CSimplePlayerApp::ExitI
54、nstance() { CoUninitialize();//COM庫反初始化 return CWinApp::ExitInstance(); } 4.3 編輯對話框界面 在資源編輯器中編輯主對話框界面,如下圖: 圖4.2 播放器界面設(shè)計 4.4.視頻窗口控制 定義一個視頻窗口的控制對象:CStatic mVideoWindow ; 在主對話框的初始化函數(shù)OnInitDialog中增加修改視頻窗口的函數(shù)mVideoWindow.ModifyStyle(0,WS_CLIPCHILDREN);并添加WM_ERASEBKGND消息響應(yīng)[9]。代碼如下: BOOL CMe
55、diaPlayerDlg::OnEraseBkgnd(CDC* pDC) { //為視頻窗口擦除背景,否則當(dāng)被其他窗口遮蔽后會變成默認(rèn)的灰色 CRect rc; mVideoWindow.GetWindowRect(&rc);//獲得窗口的矩形邊界 ScreenToClient(&rc); pDC->ExcludeClipRect(&rc);//排除被視頻窗口覆蓋的裁剪區(qū)域 return CDialog::OnEraseBkgnd(pDC);//擦除對話框剩下的區(qū)域 } 4.5封裝CDXGraph DirectShow是基于COM組件的開發(fā)包,所以此在應(yīng)用程序的最開始應(yīng)該初
56、始化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)建及其各種控制接口等,在主對話框類中,定
57、義一個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;
58、mFilterGraph = NULL; } } void CMediaPlayerDlg::CreateGraph(void) { DestroyGraph();//確保mFilterGraph為空 mFilterGraph = new CDXGraph();//新建Filter Graph if (mFilterGraph->Create())//創(chuàng)建Filter Graph Manager { mFilterGraph->RenderFile(mSourceFile); // 獲取源數(shù)據(jù) mFilterGraph->SetDisplayWindow(mVideoWin
59、dow.GetSafeHwnd());//設(shè)置顯示窗口 mFilterGraph->SetNotifyWindow(this->GetSafeHwnd());//窗口消息處理 mFilterGraph->Pause();//顯示第一幀 } 4.7創(chuàng)建播放主題 4.7.1 打開按鈕響應(yīng)函數(shù) 單擊播放器界面中的“打開”按鈕后,即可打開要播放的媒體文件,此處需要添加一個鼠標(biāo)單擊事件響應(yīng)。代碼如下: void CMediaPlayerDlg::OnButtonOpen() { CString strFilter = "AVI File (*.avi)|*.avi|";//打開文件
60、類型提示 strFilter += "MPEG File (*.mpg;*.mpeg)|*.mpg;*.mpeg|"; strFilter += "Wave File (*.wav)|*.wav|"; strFilter += "All Files (*.*)|*.*|"; CfileDialog dlgOpen(TRUE, NULL, NULL, OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, strFilter, this); //打開文件對話框 if (IDOK == dlgOpen.DoModal()) { mSourceFile = dlg
61、Open.GetPathName(); CreateGraph();//創(chuàng)建相應(yīng)的回放Filter Graph } } 4.7.2渲染 渲染媒體文件,把顯示圖像窗口和Directshow SDK的視頻窗口接口進(jìn)行捆綁。因為所有對Directshow SDK的控制是在封裝類CDXGraph中實現(xiàn)的,所以首先要創(chuàng)建一個CDXGraph對象; 然后創(chuàng)建濾波器鏈表管理器,并把讀取的文件的路徑名改為寬字符形式。渲染媒體文件,自動剖析媒體格式,構(gòu)建濾波器列表。如果渲染成功,則設(shè)置圖像顯示窗口并注冊消息通知窗口;最后顯示第一幀圖像后,馬上暫停。具體代碼如下: void CMediaPlayerD
62、lg::CreateGraph() { DestroyGraph(); //銷毀濾波器鏈表圖 m_pFilterGraph = new CDXGraph(); //創(chuàng)建CDXGraph對象 if (m_pFilterGraph->Create()) //創(chuàng)建濾波器鏈表管理器 { //if (!m_pFilterGraph->RenderFile(ch))//渲染媒體文件,構(gòu)建濾波器鏈表括 TCHAR *ch1 = m_sourceFile.GetBuffer(m_sourceFile.GetLength()); if (!m_pFil
63、terGraph->RenderFile(ch1))//渲染媒體文件?構(gòu)建濾波器鏈, { MessageBox(_T("無法渲染此媒體文件!請確認(rèn)是否安裝相關(guān)解碼器插件!\n 或者此媒體文件已損壞!"),_T( ("系統(tǒng)提示"),MB_ICONWARNING); return; } m_sourceFile.ReleaseBuffer(); //設(shè)置圖像顯示窗口 m_pFilterGraph->SetDisplayWindow(m_videoWindow.GetSafeHwnd()); //設(shè)置窗口消息通知 m_pFilterGraph->SetNotifyWindow(th
64、is->GetSafeHwnd()); //顯示第一幀圖像 m_pFilterGraph->Pause(); } } 4.7.3播放按鈕響應(yīng)函數(shù) 單擊“播放”按鈕后開始播放選擇的媒體文件,同時在標(biāo)題欄中顯示播放速度和媒體文件名。具體代碼如下: void CMediaPlayerDlg::OnButtonPlay() { if (mFilterGraph) { mFilterGraph->Run();//運行圖表 if (mSliderTimer == 0) { mSliderTimer = SetTimer(SLIDER_TIMER, 100, NULL);//
65、設(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::OnGraphNotify(WPARAM inWPar
66、am, 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊教研組工作總結(jié)
- 2024年小學(xué)高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學(xué)期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報告
- 2025年學(xué)校元旦迎新盛典活動策劃方案
- 2024年學(xué)校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告