青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

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

一、 前言

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

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

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

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

  為了理解DirectX,我們可以把系統分為四層:

  ●硬件/網絡層:放置有多媒體設備,包括圖形加速器、聲卡、輸入設備以及網絡通信設備等;

  ●DirectX基礎層:為圖像、聲音和設備提供多媒體基本服務;

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

  ●組件層:包括ActiveX控制和應用,它利用DirectX的API功能的優勢為用戶提供多媒體服務。

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

  三、DirectShow技術結構

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


圖3.1 過濾器圖表結構(Filter Graph)

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

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

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



3.2 過濾器連接圖

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

  另外,利用Filter Graph Manager能夠將事件信息傳送到應用層這一特點,可以使應用程序可以響應事件處理,例如播放或搜索流媒體中的特定時間段的數據、流結束信息等

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



圖3.3 MPEG解碼實例

四、DirectShow程序開發

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

  一個典型的DirectShow應用程序的開發通常遵循的步驟為:

  1)通過API函數CoCreateInstance()創建一個Filter Graph Manager 實例;

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

  3)對Filter Graph進行控制和對事件作出響應。

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

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

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


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

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

評論

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品五月天| 性欧美大战久久久久久久久| 国产欧美亚洲精品| 亚洲午夜视频在线| 亚洲国产天堂网精品网站| 日韩系列在线| 欧美日韩在线播放三区| 欧美在线亚洲在线| 国产精品一级二级三级| 欧美在线免费一级片| 欧美一区=区| 99re6这里只有精品| 99视频日韩| 激情五月婷婷综合| 亚洲国产精品久久久久婷婷884| 欧美日韩精品一区视频| 欧美亚洲视频在线观看| 麻豆91精品91久久久的内涵| 在线观看中文字幕不卡| 一本色道久久综合一区| 精品99一区二区| 一区二区三区黄色| 亚洲人www| 亚洲欧美日产图| 亚洲久色影视| 欧美在线免费播放| 亚洲欧美在线另类| 欧美激情一区二区三区| 性高湖久久久久久久久| 玖玖国产精品视频| 午夜宅男欧美| 女人色偷偷aa久久天堂| 亚洲综合好骚| 你懂的视频一区二区| 国产美女精品视频免费观看| 久久亚洲综合网| 欧美午夜精品一区| 亚洲第一综合天堂另类专| 国产精品s色| 欧美激情久久久久| 国产日韩精品一区观看| 欧美中文字幕视频| 亚洲欧美综合精品久久成人 | 欧美激情国产精品| 国产精品乱子久久久久| 欧美成人中文| 在线欧美不卡| 久久久精品免费视频| 性娇小13――14欧美| 国产精品尤物| 欧美一区二区三区视频免费播放| 亚洲一二三级电影| 免费亚洲一区二区| 亚洲激情网站| 亚洲精品麻豆| 欧美风情在线观看| 亚洲国产精品久久久久秋霞蜜臀 | 99成人免费视频| 一区二区三区高清在线观看| 欧美在线播放一区| 蜜臀a∨国产成人精品| 亚洲国产欧美不卡在线观看| 免费在线国产精品| av成人激情| 欧美影院在线| 亚洲国产高清自拍| 欧美日韩少妇| 久久国产精品久久久久久久久久 | 99一区二区| 久久久久久日产精品| 在线观看亚洲一区| 欧美精品一区在线播放| 欧美一区二粉嫩精品国产一线天| 亚洲精品欧美日韩| 亚洲精品小视频在线观看| 欧美色欧美亚洲另类二区| 欧美一区二区视频网站| 久久综合久久综合久久综合| 亚洲日本在线视频观看| 国产区精品视频| 国产精品白丝jk黑袜喷水| 久久久欧美精品sm网站| 亚洲国产精品成人一区二区| 1769国内精品视频在线播放| 欧美视频在线观看视频极品| 性视频1819p久久| 亚洲激情小视频| 久久激情综合| 亚洲性图久久| 亚洲男人第一av网站| 亚洲美女精品久久| 亚洲精品视频在线| 韩日欧美一区| 国产午夜久久久久| 国产精品视频精品| 国产精品视频一区二区三区| 欧美精品一区二区三区一线天视频| 久久成人免费网| 久久黄色小说| 玖玖玖免费嫩草在线影院一区| 亚洲欧美日韩国产一区| 亚洲欧美在线观看| 亚洲欧美日韩一区二区在线 | 制服丝袜亚洲播放| 亚洲黄色成人久久久| 亚洲欧洲一区二区三区| 日韩视频免费观看| 亚洲精品在线电影| 日韩特黄影片| 亚洲欧美日韩在线播放| 久久男女视频| 亚洲乱码精品一二三四区日韩在线 | 最新中文字幕亚洲| 亚洲欧美日韩一区二区在线| 久久久久久午夜| 欧美福利一区二区| 国产精品久久久久久久久久久久久| 久久婷婷亚洲| 欧美一区二区三区另类 | 久久全国免费视频| 欧美日韩成人一区二区| 国产精品综合av一区二区国产馆| 1000部精品久久久久久久久| 亚洲免费视频在线观看| 欧美激情 亚洲a∨综合| 一道本一区二区| 美女诱惑一区| 在线观看日韩精品| 久久精品视频在线看| 99在线精品视频在线观看| 久久久午夜精品| 精品成人一区二区| 久久天天狠狠| 久久久精品欧美丰满| 1769国内精品视频在线播放| 久久夜色精品亚洲噜噜国产mv| 欧美亚洲三区| 国产日韩在线一区二区三区| 亚洲欧美视频在线观看| 欧美aaaaaaaa牛牛影院| 久久久夜精品| 亚洲人精品午夜| 日韩视频精品在线观看| 欧美本精品男人aⅴ天堂| 亚洲在线1234| 一区在线视频| 亚洲国产成人av| 欧美午夜大胆人体| 欧美自拍丝袜亚洲| 欧美一进一出视频| 亚洲美女福利视频网站| 亚洲午夜在线视频| 香蕉乱码成人久久天堂爱免费| 亚洲欧美视频在线观看| 在线观看不卡av| 亚洲精品视频在线| 国产在线视频不卡二| 亚洲精品国产精品国自产观看| 欧美成人69| 久久九九国产精品| 欧美伦理91i| 欧美69视频| 国产免费观看久久| 久久国产精品免费一区| 在线视频你懂得一区| 国产精品一区二区三区免费观看| 久久综合一区| 国产精品久久看| aa国产精品| 这里只有精品视频| 免费成人你懂的| 免费观看成人www动漫视频| 国产欧美在线观看一区| 在线一区二区三区四区五区| 日韩视频在线观看| 欧美电影资源| 亚洲国产日韩精品| 欧美午夜剧场| 久久免费视频网| 欧美a级大片| 亚洲片区在线| 欧美日韩亚洲一区三区| 一本色道久久综合一区 | 蜜臀99久久精品久久久久久软件| 亚洲女性裸体视频| 国产精品久久久久久久久免费桃花| 亚洲久久成人| 久久久91精品国产一区二区精品| 国产午夜精品全部视频在线播放| 欧美大尺度在线| 亚洲精品欧美极品| 欧美视频在线观看 亚洲欧| 欧美1区3d| 午夜在线精品| 在线成人av.com| 欧美日韩麻豆| 久久蜜桃精品| 亚洲一区二区网站| 亚洲欧洲精品天堂一级| 久久久久久久综合色一本|