• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            基于DirectShow的流媒體解碼和回放

            一、 前言

              流媒體的定義很廣泛,大多數(shù)時候指的是把連續(xù)的影像和聲音信息經(jīng)過壓縮處理后放上網(wǎng)站服務(wù)器,讓用戶一邊下載一邊觀看、收聽,而不需要等整個壓縮文件下載到自己機(jī)器就可以觀看的視頻/音頻傳輸、壓縮技術(shù)。流媒體也指代由這種技術(shù)支持的某種特定文件格式:壓縮流式文件,它通過網(wǎng)絡(luò)傳輸,并通過個人電腦軟件進(jìn)行解碼。

              MCI是微軟為Windows最初提出的多媒體編程接口,隨著多媒體技術(shù)的迅速發(fā)展,各種壓縮算法在該領(lǐng)域的的應(yīng)用,MCI技術(shù)越來越顯的力不從心,最明顯的是它不支持可變比特率的壓縮算法,對于處理DVD等近年出現(xiàn)的多種新的媒體格式已顯得無能為力,而使用微軟提供的vfw之類的多媒體庫又太麻煩。怎么辦呢?
            作為MCI的"接班人",微軟又適時推出了建立在DirectX(包含DirectDraw、DirectSound、Direct3D)之上的 DirectShow技術(shù),它是在DirectX之上的媒體層,支持來自本地或網(wǎng)絡(luò)的各種視頻、音頻壓縮格式的媒體文件的解碼和回放,可以從設(shè)備上捕捉多媒體流,也可以處理各種壓縮算法處理的流媒體。這些格式包括:MPEG的音頻和視頻標(biāo)準(zhǔn)、音頻和視頻交互標(biāo)準(zhǔn)(AVI)、WAVE、MIDI和高級流格式 ASF。DirectShow對媒體數(shù)據(jù)處理采用流媒體(Multimedia Stream)的方式,在應(yīng)用中使用該方式可以大大的減少編程的復(fù)雜程度,同時又可以自動協(xié)商從數(shù)據(jù)源到應(yīng)用的轉(zhuǎn)換,流接口提供了統(tǒng)一的、可以預(yù)測的數(shù)據(jù)存取的控制方法,這樣應(yīng)用程序在播放媒體數(shù)據(jù)時不需要考慮它最初的來源和格式。
             
              二、理解DirectX

              DirectX是一個用于多媒體應(yīng)用程序和硬件增強的編程環(huán)境,它是微軟為了將其Windows建設(shè)成適應(yīng)各種多媒體的最好平臺而開發(fā)設(shè)計的。 DirectX目前已經(jīng)成為微軟自身SDK的一部分,而Windows 98/Windows 2000內(nèi)則集成了DirectX,表明它已成為操作系統(tǒng)的一部分。

              DirectX技術(shù)是一種API(應(yīng)用程序接口),每個DirectX部件都是用戶可調(diào)用的API的總和,通過它應(yīng)用程序可以直接訪問計算機(jī)的硬件。這樣,應(yīng)用程序就可以利用硬件加速器(Hardware Accelerator)。如果硬件加速器不能使用,DirectX還可以仿真加速器以提供強大的多媒體環(huán)境。

              為了理解DirectX,我們可以把系統(tǒng)分為四層:

              ●硬件/網(wǎng)絡(luò)層:放置有多媒體設(shè)備,包括圖形加速器、聲卡、輸入設(shè)備以及網(wǎng)絡(luò)通信設(shè)備等;

              ●DirectX基礎(chǔ)層:為圖像、聲音和設(shè)備提供多媒體基本服務(wù);

              ●DirectX媒體層:為動畫制作、音頻和視頻等提供API功能;

              ●組件層:包括ActiveX控制和應(yīng)用,它利用DirectX的API功能的優(yōu)勢為用戶提供多媒體服務(wù)。

              DirectShow 就是建立在DirectX媒體層之上的技術(shù),其前身是ActiveMovie2.0。它以一組API函數(shù)或ActiveX控件出現(xiàn),用途是讓開發(fā)者能夠在網(wǎng)絡(luò)上傳遞高質(zhì)量的音頻和視頻信號。值得一提的是,DirectShow為我們提供了一個開放式的開發(fā)環(huán)境,我們可以根據(jù)自己的需要定制組件

              三、DirectShow技術(shù)結(jié)構(gòu)

              DirectShow定義了如何利用標(biāo)準(zhǔn)組件來處理流媒體數(shù)據(jù),這些組件稱為過濾器。過濾器帶有輸入、輸出針角(pin),或二者兼而有之。在DirectShow技術(shù)中處于最核心位置的就是作為"過濾器"的可插入標(biāo)準(zhǔn)組件,它是執(zhí)行特定任務(wù)的COM對象。過濾器又可被細(xì)分為源過濾器(Source filter)、變換過濾器(Transform filter)、表現(xiàn)過濾器(Renderer filter)等。過濾器通過向文件讀寫、修改數(shù)據(jù)和顯示數(shù)據(jù)到輸出設(shè)備上來操作流媒體。為了完成整個任務(wù),必須要將所有的過濾器Filter連接起來,這三種過濾器組成了過濾器圖表結(jié)構(gòu),如圖3.1所示:


            圖3.1 過濾器圖表結(jié)構(gòu)(Filter Graph)

              從圖3.1中可以看出,過濾器圖表是各種過濾器的集合,它是通過過濾器的輸入輸出針腳"pin"順序連接而成的,這些過濾器的針腳通過協(xié)商來決定它們將支持何種形式多媒體。由于DirectShow支持可重構(gòu)的過濾器圖表結(jié)構(gòu),所以使用相同的軟件組件可以播放多種類型的媒體。開發(fā)人員可以通過定義自己的過濾器來擴(kuò)展DirectShow對媒體的支持功能。

              在過濾器圖表結(jié)構(gòu)中,源過濾器用來從數(shù)據(jù)源獲取數(shù)據(jù),并將數(shù)據(jù)傳送到過濾器圖表中,這里的數(shù)據(jù)源可以是攝像機(jī)、因特網(wǎng)、磁盤文件等;轉(zhuǎn)換過濾器用來獲取、處理和傳送媒體數(shù)據(jù),它包括分離視頻和音頻的分解變換過濾器(Splitter transform filter)、解壓視頻數(shù)據(jù)的視頻轉(zhuǎn)換過濾器(Video transform filter)、解壓音頻數(shù)據(jù)的音頻轉(zhuǎn)換過濾器(Audio transform filter);表現(xiàn)過濾器用來在硬件上表現(xiàn)媒體數(shù)據(jù),如顯卡和聲卡,或者是任何可以接受媒體數(shù)據(jù)的地方,如磁盤文件。它包括用來顯示圖像的視頻表現(xiàn)過濾器(Video renderer filter)、將音頻數(shù)據(jù)送到聲卡上去的音頻表現(xiàn)過濾器(Audio renderer filter)。

              在過濾器圖表中,為了完成特定的任務(wù),必須將所有需要的過濾器連接起來,因此前級過濾器的輸出必定成為下級過濾器的輸入。一個過濾器至少有一個輸入針(Input pin),并將特定的輸出送到輸出針(Output pin);圖3.2顯示了一個過濾器連接圖:



            3.2 過濾器連接圖

              你的應(yīng)用程序不需要對過濾器圖表中的各個過濾器進(jìn)行單獨的處理,因為在更高的層次上,DirectShow提供的一個稱為過濾圖表管理器的部件(FGM)管理著這些過濾器的連接和流媒體數(shù)據(jù)在過濾器之間的流動,FGM (唐:也就是filter graph manager)提供了一套COM接口,應(yīng)用程序可以通過它來訪問過濾器圖表、控制流媒體或者接收過濾器事件。如果需要,它可以自動的插入一個合適的解碼器,并將轉(zhuǎn)換過濾器的輸出針腳連接到表現(xiàn)過濾器。應(yīng)用程序可以通過與過濾圖表管理器的通信來控制過濾器圖表的活動。程序開發(fā)人員只需要調(diào)用API函數(shù)來實現(xiàn)對流媒體的控制,如run方法啟動流媒體在過濾器圖表(Filter graph)中的流動;pause方法暫停流媒體的播放;stop方法停止播放流媒體等。

              另外,利用Filter Graph Manager能夠?qū)⑹录畔魉偷綉?yīng)用層這一特點,可以使應(yīng)用程序可以響應(yīng)事件處理,例如播放或搜索流媒體中的特定時間段的數(shù)據(jù)、流結(jié)束信息等

              圖3.3是一個MPEG解碼播放的實例,可以看出Source filter將獲取的多媒體數(shù)據(jù)通過Outpin送到MPEG分解轉(zhuǎn)換過濾器,MPEG分解轉(zhuǎn)換過濾器有一個輸入針腳,兩個輸出針角分別將視頻和音頻解釋碼器進(jìn)行解碼,最后兩路數(shù)據(jù)分別通過視頻表示過濾器、音頻表示過濾器送到顯卡和聲卡進(jìn)行回放。



            圖3.3 MPEG解碼實例

            四、DirectShow程序開發(fā)

              DirectShow 建立在COM組件技術(shù)基礎(chǔ)上,所以開發(fā)DirectShow程序必須要掌握COM組件技術(shù)。DirectShow與COM緊密相連,它所有的部件和功能都由COM接口來構(gòu)造和實現(xiàn),其開發(fā)方式相當(dāng)靈活,沒有固定的模式,通常隨不同的需要使用不同的COM接口。但是其中幾個重要的接口確實經(jīng)常需要用到的:IGraphBuilder接口,這是最為重用的COM接口,用來創(chuàng)建Filter Graph Manager;IMediaControl接口,用來控制流媒體在濾波器圖表(Filter Graph)中的流動,例如流媒體的啟動和停止;IMediaEvent接口,該接口在Filter Graph發(fā)生一些事件時用來創(chuàng)建事件的標(biāo)志信息并傳送給應(yīng)用程序。

              一個典型的DirectShow應(yīng)用程序的開發(fā)通常遵循的步驟為:

              1)通過API函數(shù)CoCreateInstance()創(chuàng)建一個Filter Graph Manager 實例;

              2)通過調(diào)用QueryInterface ( )函數(shù)來獲取Filter Graph 和IMediaEvent組件的指針;

              3)對Filter Graph進(jìn)行控制和對事件作出響應(yīng)。

              下面舉一個簡單的例子來說明如何利用DirectShow技術(shù)對多媒體流進(jìn)行解碼回放的。首先生成一個名為MediaPlay的單文檔應(yīng)用程序,定義一個名字為MediaPlay的函數(shù),該函數(shù)的具體實現(xiàn)代碼為:

            void PlayMovie(LPTSTR lpszMovie)
            {
             IMediaControl *pMC = NULL;
             IGraphBuilder *pGB = NULL;
             IMediaEventEx *pME = NULL;
             long evCode; // something to hold a returned event code
             hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
             IID_IMediaControl, (void **)&pMC);
             hr = pMC->QueryInterface(IID_IGraphBuilder, (void **)&pGB);
             hr = pMC->QueryInterface(IID_IMediaEventEx, (void **)&pME);
             hr = pGB->RenderFile(lpszMovie, NULL);
             hr = pMC->Run();
             hr = pME->WaitForCompletion(INFINITE, &evCode);
             if(pMC)pMC->Release();
              if(pGB)pGB->Release();
               if(pME)pME->Release();
            }

              上述代碼中,CoCreateInstance()函數(shù)創(chuàng)建了一個過濾器圖表(Filter Graph)對象,并返回一個媒體控制(ImediaControl)接口,這個接口通過過濾器來實現(xiàn)播放、暫停、停止等媒體放映功能,但是這時候圖表對象并不包含具體的過濾器,因為此時DirectX并不清楚需要播放何種類型的媒體;接下來創(chuàng)建一個圖表構(gòu)建接口,該接口可以實現(xiàn)創(chuàng)建過濾器圖表、向圖表對象添加、刪除各種過濾器、列舉當(dāng)前過濾器圖表中所有的過濾器、連接圖表對象中的各個過濾器等功能;本例中使用了IGraphBuilder 接口的RenderFile()函數(shù),告訴DirectX需要播放的媒體文件名,此時IgraphBuilder對象接口根據(jù)多媒體文件的類型,自動向過濾器圖表添加播放該類型媒體所需的的各種過濾器,并實現(xiàn)其連接。

              最后,函數(shù)調(diào)用ImediaControl接口對象的Run()函數(shù),就可以開始播放媒體文件了。為了實現(xiàn)從頭至尾的順序播放完多媒體文件,需要調(diào)用IMediaEventEx 對象接口的WaitForCompletion()阻塞函數(shù)的運行,直到媒體文件結(jié)束后才可以釋放對象、結(jié)束函數(shù)的運行。


            Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=245654

            posted on 2007-01-22 14:36 大龍 閱讀(642) 評論(1)  編輯 收藏 引用

            評論

            # re: 基于DirectShow的流媒體解碼和回放 2009-02-27 14:22 sa

            這個顏色字看的很不舒服,即使再有用也不看,建議改  回復(fù)  更多評論   


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            激情伊人五月天久久综合| 久久亚洲色一区二区三区| 久久精品国产亚洲av日韩| 国内精品久久人妻互换| 久久青青草原精品国产不卡| 超级97碰碰碰碰久久久久最新| 亚洲av伊人久久综合密臀性色| 亚洲一本综合久久| 久久久久av无码免费网| 久久久久久狠狠丁香| 久久精品国产99国产精品亚洲| 亚洲一区二区三区日本久久九| 国产成人精品综合久久久| 久久96国产精品久久久| 亚洲熟妇无码另类久久久| 国产香蕉97碰碰久久人人| 久久精品国产亚洲精品2020| 日日狠狠久久偷偷色综合96蜜桃| 99久久777色| 久久久久亚洲Av无码专| 久久国语露脸国产精品电影| 久久久久一本毛久久久| 国产精品欧美亚洲韩国日本久久 | 久久综合久久自在自线精品自| 久久国产成人午夜AV影院| 国产精品久久久久久久久| 蜜臀久久99精品久久久久久小说| 亚洲精品tv久久久久| 久久人人爽人人爽AV片| 国产成人综合久久精品尤物| 亚洲国产精品热久久| 9999国产精品欧美久久久久久| 国内精品九九久久久精品| 久久人人妻人人爽人人爽| 亚洲AV日韩精品久久久久久久| 中文字幕乱码人妻无码久久| 久久香综合精品久久伊人| 久久国语露脸国产精品电影| 色88久久久久高潮综合影院| 久久久久亚洲Av无码专| 99久久久国产精品免费无卡顿 |