歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

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

  • 資源ID:66871189       資源大?。?span id="k75n0vz" class="font-tahoma">1.30MB        全文頁數(shù):54頁
  • 資源格式: DOC        下載積分:0積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要0積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復下載(系統(tǒng)自動生成)
支付說明:
本站最低充值0.01積分,下載本資源后余額將會存入您的賬戶,您可在我的個人中心查看。
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

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

精選優(yōu)質(zhì)文檔-傾情為你奉上 題 目 在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn) 學生姓名 崔媛媛 學號 所在學院 物理與電信工程學院 專業(yè)班級 電子1202 指導教師 李菊葉 完成地點 物電學院計算機信息處理分室 2016 年 6 月 5 日專心-專注-專業(yè)畢業(yè)論文設(shè)計任務(wù)書院(系) 物電學院 專業(yè)班級 電子信息工程 學生姓名  崔媛媛 一、畢業(yè)論文設(shè)計題目 在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn) 二、畢業(yè)論文設(shè)計工作自 2016 年 3 月 10 日 起至 2016 年 6 月 20 日止三、畢業(yè)論文設(shè)計進行地點: 物電學院計算機信息處理分室 四、畢業(yè)論文設(shè)計的內(nèi)容要求:隨著網(wǎng)絡(luò)的普及,在線播放器也日益普及起來。本設(shè)計要求學生利用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.天津大學出版社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.北京:清華大學出版社,2004. 5謝希仁.計算機網(wǎng)絡(luò)(第五版)M.北京:電子工業(yè)出版社,2012. 6朱桂英.張元亮 Visual C+網(wǎng)絡(luò)編程開發(fā)與實踐M.清華大學出版社.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日:打印論文準備并完成答辯。 指導教師簽名 系(教研室)主任簽名 專業(yè)負責人簽名 批準日期 在線視頻播放系統(tǒng)的實現(xiàn)與設(shè)計崔媛媛(陜西理工學院物理與電信工程學院電子信息工程專業(yè),2012級2班,陜西 漢中 )指導教師:李菊葉摘要本設(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 design 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 Visual 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, completed 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.引言隨著社會的發(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)用程序和硬件底層的差異性。而DirectShow是基于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),掌握在它上面的多媒體開發(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ā)的軟件以后的移植和兼容問題提供了良好的解決方案。 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+以及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+類的方式封裝了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ù)體系,更加直觀和便于操作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è)備,虛線上面是Ring 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 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。這個流可以源自硬盤上的文件,也可以是實時設(shè)備,如話筒,攝像頭,或是DC。如果這個流是源自磁盤,那么它可以是預先記錄的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)接收一個輸入流,對流執(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)建一個多通管道,意思是一個輸入流可以復制到一個或多個輸出pin上。而有些轉(zhuǎn)換filter可以將多個輸入流混合成一個流。渲染filter將DS流轉(zhuǎn)換成某種形式的輸出。如基本的渲染filter可以將流寫到文件。而其它的渲染filter可以將音頻流發(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主要負責獲取數(shù)據(jù),數(shù)據(jù)源可以是文件、因特網(wǎng)計算機里的采集卡(WDM驅(qū)動的或VFW驅(qū)動的)數(shù)字攝像機等,然后將數(shù)據(jù)往下傳輸;Transform Filter主要負責數(shù)據(jù)的格式轉(zhuǎn)換,例如數(shù)據(jù)流分離、合成,解碼、編碼等,然后將數(shù)據(jù)繼續(xù)往下傳輸;Rendering Filter主要負責數(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)中的組件用新的代替掉,以方便隨時進行系統(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)成一條順序的鏈路。Filter的分類亦可根據(jù)Filter包含的輸入Pin或者輸出Pin的數(shù)量進行。過濾器間的連接,實質(zhì)上就是連接雙方的媒體類型媒體協(xié)商的過程。連接大致的過程為:若調(diào)用連接函數(shù)的時候已指定完整的媒體類型,那么用此媒體類型進行連接,是否成功都要結(jié)束連接進程;如不完全指定或沒有指定媒體的類型,就進行下面的枚舉過程:枚舉欲連接的輸入引腳上的所有的媒體類型,逐一使用此媒體類型和輸出引腳進行連接(如連接函數(shù)提供不完全媒體類型,就要先把每個枚舉出的媒體類型和它進行匹配檢查),若輸出引腳也接受此媒體類型,那么引腳間的連接就成功了;如果輸出引腳對全部輸入引腳上所枚舉的媒體類型均不支持,那么就枚舉輸出引腳上的全部媒體類型,且逐一利用這些媒體類型和輸入引腳來進行連接,如果輸入引腳接受其中的一種媒體類型,那么引腳間的連接就成功了;如果對輸出引腳上的全部媒體類型輸入引腳均不支持,則這兩個引腳間的連接過程宣告失敗。如圖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在DirectShow中,一個播放程序必需實例化一個或多個過濾器,并把它們連接起來。這樣數(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 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 Graph :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ù)保存于主存儲器里,且通過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之間實現(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ā)送事件的通知;IMediaEvent:應(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有事件發(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=pGraph->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,eventParam2=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)復位。我們可以通過IMediaEvent:GetEventHandle來得到這個事件同步對象的句柄。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,&param1,&param2,0),SUCCEEDED(hr)printf("Event code:%#04xn   Params:%d,%dn",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 Manager上(或直接在某個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要求提供相應(yīng)數(shù)據(jù)。AVI Splitter與AVI解壓處理屬于Transform Filters,其中,AVI Splitter負責向Filter Source索取數(shù)據(jù),并將取得的音頻和視頻進行分離,然后分別從各自的輸出pin輸出:AVI 解壓處理負責視頻的解碼。Video Renderer和默認的音頻裝置負責同步播放聲音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媒體文件播放及控制已知媒體文件存儲信息的基礎(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(,pMediaControl)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->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ù)。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,則失敗返回。所以只要Filter Graph中有不同類型的、可接受同一媒體類型的Filter,則采用智能連接,每個Filter都可連在正確的位置。為什么在智能連接中不同類型的Filter會連在各自的位置上呢?因為這些Filter能接受的媒體類型不同。從源Filter出來的數(shù)據(jù)流只帶有編碼格式信息,其他信息都是未知的,所以音視頻解碼Filter和處理Filter都不能用,只能使用分離Filter匹配這種媒體類型,所以只會試連接分離Filter。而從分離Filter出來的數(shù)據(jù)分為音、視頻兩路,每路的數(shù)據(jù)流都加上了音頻或者視頻的信息,但沒有標明這是何種音頻或視頻的信息,所以可以被音視頻解碼器Filter接受,但不能被音視頻處理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并復制到C:Program FilesMicrosoft 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-time library選擇Debug Multithreaded Dll。(3)配置必要鏈接庫的文件,即在Visual C+的菜單里選擇Project|Settings|Link,在彈出對話框中Category中選擇General,再在Object/library modules輸入strmbasd.lib uuid.lib winmm.lib。(4)確認Direct 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_pMainWnd = &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_CLIPCHILDREN);并添加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ā)包,所以此在應(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)建及其各種控制接口等,在主對話框類中,定義一個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;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(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)|*.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的視頻窗口接口進行捆綁。因為所有對Directshow 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)建濾波器鏈表管理器/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_pFilterGraph->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)mSliderTimer = 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:OnGraphNotify(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

注意事項

本文(在線視頻播放系統(tǒng)的設(shè)計與實現(xiàn))為本站會員(29)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復下載不扣分。




關(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),我們立即給予刪除!