《電子技術應用》
您所在的位置:首頁 > 其他 > 業界動態 > DirectShow過濾器組件開發技術及其應用實例

DirectShow過濾器組件開發技術及其應用實例

2009-08-14
作者:盛 健 季曉勇

  摘? 要: 討論了DirectShow過濾器組件的開發技術,給出了網絡視頻應用中的一個過濾器組件開發實例。

  關鍵詞: DirectShow? 過濾器? COM? 視頻應用

?

1? DirectShow概述

  DirectShow是Windows平臺下流行的流媒體開發體系,可以實現高質量的音視頻采集、編輯、編碼、解碼、格式轉換、播放。它解決了網絡音頻及視頻信息傳輸中數據量大、數據源種類多、客戶端軟硬件環境不確定、視頻音頻需要同步等問題,因此有著廣泛的應用。

  DirectShow使用模塊化的體系結構,最主要的組件是過濾器(Filter)。DirectShow把一系列過濾器組合起來形成DirectShow應用程序。每個過濾器提供一種功能,如獲取數據源、編碼、解碼、播放等。DirectShow提供了很多標準過濾器,用戶可以直接使用。但由于媒體格式、壓縮方式、硬件屬性等方面的特殊要求,用戶經常需要自行開發過濾器來滿足具體需求。

DirectShow應用程序中主要包含以下3種過濾器:源過濾器(Source Filter)、轉換過濾器(Transform Filter)、呈現過濾器(Render Filter),分別負責獲取數據流、處理數據流和播放數據流。有時還需要分解過濾器(Splitter Filter)和合并過濾器(Mux Filter)來分解和合并數據流。

  DirectShow是基于COM(組件對象模型)規范的。過濾器是一種COM組件。應用程序把多個過濾器組件組合起來,形成對媒體流的處理流程。這一整套過濾器集合被稱為過濾器圖(Filter Graph)。DirectShow提供FGM(Filter Graph Manager)組件來控制整個過濾器圖。過濾器前后相連,連接點也是COM對象,被稱為針腳(Pin)。

  DirectShow應用程序的原理圖如圖1所示。來自文件系統或外設的數據先由過濾器處理,再存儲到文件系統或由外設播放。過濾器負責與文件系統和外設的交互。應用程序只需控制過濾器,不用關心其他軟件和硬件的具體情況。

?

2?過濾器組件開發技術

  DirectShow為過濾器組件開發提供了一套基類庫(Base Class Library),包括過濾器基類、針腳基類和一些輔助類。基類庫為過濾器組件的開發提供了一個框架,省去了復雜的底層編碼工作。用戶可將開發工作集中到如下二個方面:(1)傳輸和處理媒體流。(2)將過濾器封裝為COM組件。

2.1 媒體流的傳輸和處理

  為了傳輸數據,用戶過濾器先要與過濾器圖中其他過濾器連接起來。連接時要進行媒體格式和內存分配器的協調。過濾器之間通過針腳相連。過濾器之間媒體格式和內存分配器的協調實際上是通過針腳之間的通信來完成的。 

  主動連接方的過濾器的針腳首先獲取自身支持的所有媒體格式,然后把其中一種格式送交給被動連接的一方。被動方的針腳進行判斷:如果支持該格式,媒體格式協調成功;如果被動方不支持該格式,就通知主動方,主動方再提供1種不同的格式送交被動方,直到被動方支持被提供的格式,協調成功,否則,當主動方用完所有支持的格式,協調失敗。

  DirectShow過濾器使用一種稱作內存分配器(Allocator)的COM對象管理媒體流數據。當2個過濾器連接前,其中1個過濾器上的針腳提供1個內存分配器。另外1個過濾器上的針腳對這個內存分配器進行檢測。當2個針腳都支持該內存分配器時,協調成功。

  媒體流傳輸開始之前,內存分配器負責創建一系列內存緩沖區。媒體流傳輸時,上游(Upstream)過濾器填充這些緩沖區,并把它們傳送給下游(Downstream)過濾器。DirectShow使用一種稱作媒體采樣包(Media Sample)的COM對象管理單個緩沖區。通過控制媒體采樣包對象,可以修改當前緩沖區中的媒體類型、時間戳等信息,也可以利用算法處理媒體數據,從而實現對媒體流的處理。

2.2 COM組件的實現

  COM組件的實現包括如下內容:用接口規定過濾器組件對外提供的功能;提供類廠,用以創建COM對象的實例;提供COM對象所在dll文件的各個輔助函數,以完成COM組件在應用程序中的載入和釋放,在注冊表中的注冊和注銷。

  DirectShow中的過濾器、針腳等COM對象通過接口對外提供各種功能。除了提供標準的接口之外,DirectShow還提供了DECLARE_INTERFACE宏讓用戶自定義接口,從而滿足用戶對過濾器組件的指定要求。

  COM實現機制中用類廠創建COM對象實例。DirectShow提供了類廠類CClassFactory和類廠模板類CFactoryTemplate。通過將不同的類廠模板的內容填入類廠,實現不同的類廠對象,從而創建不同COM對象實例。

  過濾器是dll文件格式的COM組件,需要以下函數:DllMain(載入時的入口)、DllGetClassObject(創建類廠對象)、DllCanUnloadNow(判斷是否釋放dll)、DllRegisterServer(在注冊表中注冊dll)、DllUnregisterServer(在注冊表中反注冊dll)。DirectShow已經實現了前3個函數。后面的2個函數通常調用DirectShow中的函數AMovieDllRegisterServer2()來實現,即:

  STDAPI DllRegisterServer()

???? ?? ?????? {?? return AMovieDllRegisterServer2(TRUE );}

????STDAPI DllUnregisterServer()

????????????? ? {?? return AMovieDllRegisterServer2(FALSE);}

3? 過濾器組件開發技術應用實例

???下面介紹過濾器組件開發技術在網絡視頻服務中的一個應用實例。“網絡數字攝像機”系統使用攝像機采集視頻,經過編碼壓縮后發送到網絡上??蛻舳顺绦蚪邮諗祿⒔獯a。用戶過濾器利用這些數據生成視頻流,進行播放或者錄像。“網絡數字攝像機”客戶端程序的基本流程如圖2所示。

?

  客戶端程序采用多線程的方式,網絡數據接收線程、解碼線程與視頻流生成線程同時運行。在線程之間使用隊列存放數據。前一個線程將數據寫入隊列,后一個線程從隊列中取出數據。要實現的過濾器組件例程位于視頻流生成線程內,與解碼線程共享一個數據隊列。此隊列放在一個自定義的類CDataAdmin中。解碼線程把數據放到隊列中。用戶過濾器從隊列中取出數據,生成視頻流。

3.1 用戶過濾器的實現

  (1)選擇合適的基類

  用戶過濾器使用整個過濾器圖外部的數據生成視頻流,屬于源過濾器?;悗熘械腃Source類是源過濾器的基類,CSource使用CSourceStream基類作為它的針腳。本例中從這2個類派生出CCustomFilter和CCustomPin,作為實際使用的過濾器類和針腳類。

  (2)通過自定義接口獲得隊列數據

  為了獲得過濾器外部的隊列數據,需要為CCustomFilter提供一個自定義的接口。下面的代碼定義了一個IDataSource接口:DECLARE_INTERFACE_(IDataSource,IUnknown){STDMETHOD(SetData)(THIS_CDataAdmin*pData)PURE;}。CCustomFilter繼承該接口,對外提供了一個SetData()操作。SetData()將外部傳入的CDataAdmin*類型的指針賦值給CCustomFilter的成員變量,過濾器即獲取到外部隊列數據。

  (3)協調媒體類型

  CSourceStream基類完成了媒體類型協調中大部分的工作,用戶只需要指定過濾器針腳支持的媒體格式。CSourceStream的成員函數GetMediaType()負責完成這個任務,用戶必須在該函數中為過濾器指定媒體格式。媒體流的信息存放在一個VIDEOINFOHEADER的結構中,指針pvi指向該結構。函數GetMediaType()中指定媒體格式的代碼如下:

  pMediaType->SetType(&MEDIATYPE_Video);

    //設置媒體主類型

  pMediaType->SetSubtype(&GetBitmapSubtype(&pvi->bmiHeader));  //設置媒體次類型

  pMediaType->SetFormatType(&FORMAT_VideoInfo);

                                  //設置媒體格式

  pMediaType->SetTemporalCompression(FALSE);

                                  //不壓縮媒體流

  pMediaType->SetSampleSize(pvi->bmiHeader.biSizeImage);     //設置媒體采樣包大小

  (4)協調內存分配器

  CSourceStream基類完成了大多數內存分配器的協調工作。用戶還需要指定每個媒體采樣包的大小。CSourceStream基類的成員函數DecideBufferSize()負責完成此任務。下面是該函數中的主要代碼。

  pRequest->cbBuffer=pvi->bmiHeader.biSizeImage;

                                  //獲取采樣包大小需求信息

  ALLOCATOR_PROPERTIES Actual;

  hr=pAlloc->SetProperties(pRequest,&Actual);

                                  //指定采樣包大小,并返回實際的設置結果

  (5)生成視頻流

  CSourceStream基類的FillBuffer()成員函數負責把外部隊列數據加入到視頻流中。用戶可以在此函數內部先處理數據,再把處理過的數據加入視頻流中。本例中經用戶過濾器解碼后的數據,不需要進行處理。函數FillBuffer()中的主要代碼如下。

                                 //獲取當前媒體采樣包對應的緩沖區的地址和大小

  BYTE*pData;

  DWORD cbData;

  pSample->GetPointer(&pData);

  cbData=pSample->GetSize();

                                  //獲取媒體信息

  VIDEOINFOHEADER*pVih=(VIDEOINFOHEADER*)

  m_mt.pbFormat;

                                 //從數據隊列中取出數據填充到當前緩沖區中

  m_pFilePack=m_pPinData->GetDataBuffer();

  memcpy(pData,m_pFilePack,min(pVih->

  bmiHeader.biSizeImage,cbData));

                                 //給媒體采樣包加上時間戳

  REFERENCE_TIME rtStart=m_iFrameNumber

  *m_rtFrameLength;

  REFERENCE_TIME rtStop=rtStart+m_rtFrameLength;

  pSample->SetTime(&rtStart,&rtStop);

                                 ?//幀計數器加1

  m_iFrameNumber++;

  (6)生成COM組件

  過濾器開發工作的最后一步是將過濾器封裝成COM組件。此外,需要提供類廠模板。代碼如下:

  CFactoryTemplate g_Templates[]={g_wszCustomFilter,

  &CLSID_CustomFilter,CCustomFilter∷CreateInstance,

  NULL,NULL };                          //將過濾器信息填入類廠模板

  int g_cTemplates=sizeof(g_Templates)/sizeof(g_Templates[0]);  //類廠模板個數

3.2 實際應用效果

??? 在“網絡數字攝像機”系統的客戶端應用程序中使用上例的過濾器組件,若連接到視頻播放過濾器(Video Renderer)則可播放視頻,播放效果如圖3所示;若連接到寫文件過濾器(File Writer),可將視頻直接寫成硬盤文件,實現視頻錄像。過濾器采用COM組件的形式,可方便地移植到其他機器和應用程序中。

4? 結束語

  過濾器組件在目前多種多樣的音頻視頻流媒體應用中發揮著重要作用。過濾器組件的開發具有較大的實用價值,但有一定的難度和復雜性。本文討論了用戶過濾器開發中的原理和技術。文中過濾器組件例子的開發過程具有較大的通用性,可供其他開發者參考。

?

參考文獻

1? Kruglinski D J.VC++技術內幕(第4版).北京:清華大學出版社,1999

2? 潘愛民.COM原理和應用.北京:清華大學出版社,1999

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲国产精品第一区二区| 国产精品夜夜夜| 欧美视频在线视频| 国产精品性做久久久久久| 欧美调教vk| 蜜臀久久久99精品久久久久久| 欧美一级淫片aaaaaaa视频| 国产亚洲成av人在线观看导航| 欧美电影专区| 久久久久久久久一区二区| 国产精品99久久久久久白浆小说| 国产精品99一区| 亚洲精品久久久久久下一站| 午夜免费在线观看精品视频| 亚洲男人第一网站| 国内精品久久国产| 亚洲国产导航| 一区二区三区国产精品| 亚洲淫性视频| 好吊日精品视频| 国产精品揄拍一区二区| 亚洲综合日韩中文字幕v在线| 激情综合视频| 国产亚洲第一区| 亚洲小视频在线| 欧美在线亚洲在线| 亚洲高清123| 久久爱另类一区二区小说| 亚洲毛片av在线| 一区二区三区波多野结衣在线观看| 亚洲网站视频福利| 欧美激情视频给我| 99国产精品一区| 欧美国产日韩在线观看| 亚洲在线第一页| 欧美日韩精品免费观看视一区二区| 亚洲中字黄色| 亚洲女同性videos| 亚洲国产美国国产综合一区二区| 午夜国产一区| 在线欧美影院| 另类专区欧美制服同性| 亚洲欧美国产另类| 国产精品第三页| 91久久精品美女高潮| 国产精品视频yy9299一区| 亚洲午夜精品在线| 国产精品欧美日韩| 在线色欧美三级视频| 国产精品国产| 国产农村妇女毛片精品久久麻豆| 欧美精选一区| 久久精品国产免费看久久精品| 欧美一级片在线播放| 亚洲激情在线激情| 久久色中文字幕| 黄色在线一区| 国产精品a久久久久| 国产欧美日韩不卡| 久久一区二区精品| 国产午夜亚洲精品不卡| 欧美国产在线视频| 国产精品女人久久久久久| 久久精品成人一区二区三区蜜臀| 黄色成人在线网站| 欧美**字幕| 亚洲高清免费在线| 亚洲精品久久久久久久久久久久| 国产精品入口夜色视频大尺度| 亚洲国产cao| 午夜精品久久久久久| 亚洲看片一区| 看欧美日韩国产| 国产精品成人一区二区三区夜夜夜| 国产伦精品一区二区三区视频黑人| 欧美激情综合| 久久综合伊人77777麻豆| 国产伦精品一区二区三| 欧美另类女人| 在线日本成人| 亚洲男女自偷自拍图片另类| 久久久午夜电影| 欧美插天视频在线播放| 嫩草成人www欧美| 美女精品视频一区| 欧美天堂在线观看| 亚洲日本aⅴ片在线观看香蕉| 午夜视频一区二区| 伊人天天综合| 日韩一二三区视频| 亚洲视频一区二区在线观看| 国产主播一区二区三区四区| 一本大道久久a久久综合婷婷| 影音先锋国产精品| 久久精品毛片| 国产农村妇女毛片精品久久麻豆| 久久五月婷婷丁香社区| 一区精品久久| 国产亚洲美州欧州综合国| 亚洲精品黄网在线观看| 久久不射中文字幕| 亚洲精品在线电影| 欧美成人免费小视频| aa日韩免费精品视频一| 亚洲精品国偷自产在线99热| 国产精品色午夜在线观看| 亚洲欧美在线观看| 久久精品五月| 国产一区美女| 日韩午夜免费| 在线观看中文字幕亚洲| 国产精品激情偷乱一区二区∴| 欧美美女bb生活片| 欧美日韩性生活视频| 亚洲中午字幕| 亚洲欧洲视频| 欧美日韩亚洲一区三区| 亚洲欧美制服另类日韩| 国产精品日韩一区| 欧美一区二区日韩| 欧美日韩亚洲另类| 亚洲欧美国产一区二区三区| 国产片一区二区| 国产一区视频观看| 国产欧美日韩另类视频免费观看| 欧美精品一区二区在线播放| 久久精品网址| 国产精品青草久久久久福利99| 国产精品久久久久久久久久久久久久| 欧美日本不卡| 欧美一二三视频| 中文在线一区| 欧美女同在线视频| 先锋影音一区二区三区| 国产亚洲一区精品| 激情一区二区三区| 欧美精选一区| 国产伦精品一区二区三区照片91| 亚洲国产日韩欧美在线99| 亚洲一区二区三区三| 国产一区二区看久久| 欧美精品成人| 国产精品欧美精品| 一色屋精品亚洲香蕉网站| 午夜精品久久久久久久男人的天堂| 欧美日韩成人在线观看| 欧美日韩一区在线观看| 亚洲欧美国产视频| 海角社区69精品视频| 狠狠色综合色综合网络| 伊人色综合久久天天| 欧美激情综合色综合啪啪| 欧美三级电影网| 亚洲免费在线| 国产裸体写真av一区二区| 亚洲人体一区| 亚洲裸体在线观看| 一区二区免费在线播放| 久久高清免费观看| 国产精品免费视频xxxx| 欧美一区二区日韩| 亚洲第一福利在线观看| 欧美主播一区二区三区美女 久久精品人| 亚洲一区二区三区视频播放| 久久久精品一品道一区| 久久久综合香蕉尹人综合网| 亚洲在线观看免费视频| 亚洲国产一成人久久精品| 国产亚洲va综合人人澡精品| 欧美日韩精品是欧美日韩精品| 欧美三区美女| 国产精品视频网站| 99精品国产在热久久下载| 久久精品国产清高在天天线| 亚洲欧洲日本专区| 国产精品成人午夜| 精品成人乱色一区二区| 亚洲图片欧美午夜| 欧美日韩亚洲综合在线| 午夜精品久久久久久99热| 久久久久久一区二区三区| 亚洲午夜激情网页| 国产精品久久久久久久一区探花| 国产欧美一区二区三区视频| 亚洲激情第一区| 亚洲欧美日本国产有色| 欧美一区二区三区精品| 欧美精品观看| 久久成人av少妇免费| 国产日韩三区| 国产精品视频你懂的| **性色生活片久久毛片| 一本一道久久综合狠狠老精东影业| 欧美日韩一区二区三区四区在线观看| 欧美丝袜一区二区三区| 国产精品久久久亚洲一区| 欧美岛国在线观看| 欧美日本在线看| 亚洲视频www| 久久精品中文字幕一区二区三区| 久久gogo国模啪啪人体图| 在线看片第一页欧美| 欧美不卡在线视频| 久久超碰97中文字幕| 91久久香蕉国产日韩欧美9色| 韩国三级电影一区二区| 亚洲国产精品一区二区久| 伊人春色精品| 久久精品日产第一区二区三区| 性欧美xxxx大乳国产app| 国产欧美短视频| 制服丝袜激情欧洲亚洲| 欧美日韩精品一区| 亚洲一级特黄| 欧美日韩国产精品一卡| 9久re热视频在线精品| 亚洲香蕉网站| 久久精品91久久香蕉加勒比| 欧美福利视频在线观看| 欧美日韩日本国产亚洲在线| 99这里只有精品| 亚洲午夜一区二区| 国产精品永久入口久久久| 一区二区日韩欧美| 尤物九九久久国产精品的分类| 欧美成人激情视频| 乱中年女人伦av一区二区| 精品成人在线| 久久亚洲二区| 国产精品一区免费观看| 久久久伊人欧美| 久久综合影音| 国产欧美一区视频| 欧美激情精品久久久久久免费印度| 国产一区日韩二区欧美三区| 免费成人黄色片| 国产在线麻豆精品观看| 亚洲国产综合在线看不卡| 久久久久欧美精品| 在线国产欧美| av72成人在线| 裸体一区二区三区| 国产一区二区三区四区在线观看| 亚洲国产日韩在线一区模特| 欧美日本在线视频| 亚洲国产第一页| 亚洲免费在线视频一区 二区| 亚洲乱码久久| 日韩视频一区二区在线观看| 国产精品v日韩精品v欧美精品网站| 欧美第一黄色网| 欧美成人第一页| 亚洲欧洲日本一区二区三区| 亚洲精品专区| 91久久精品一区二区别| 亚洲欧洲日产国产网站| 欧美在线不卡视频| 欧美激情在线狂野欧美精品| 久久美女性网| 欧美高清在线一区| 欧美国产高潮xxxx1819| 99国产精品久久久| 久久一本综合频道| 国产网站欧美日韩免费精品在线观看| 欧美黄色一级视频| 亚洲在线成人| 欧美一区2区三区4区公司二百| 欧美日本三区| 亚洲一区三区在线观看| 欧美日韩高清不卡| 永久91嫩草亚洲精品人人| 欧美剧在线观看| 国产老女人精品毛片久久| 欧美精彩视频一区二区三区| 亚洲国产精品精华液网站| 欧美一区影院| 国产精品私房写真福利视频| 在线日韩中文字幕| 一区二区三区自拍| 国产日韩欧美亚洲| 久久久久网站| 国产婷婷色综合av蜜臀av| 亚洲欧洲视频在线| 韩国三级电影久久久久久| 欧美高清视频一二三区| 亚洲激情视频在线播放| 在线观看福利一区| 国产情人节一区| 亚洲精品美女91| 欧美激情一区在线观看| 亚洲自拍都市欧美小说| 亚洲国产高清高潮精品美女| 国产精品一区二区三区久久| 中文在线资源观看网站视频免费不卡| 宅男噜噜噜66一区二区66| 久久精品一区二区三区不卡| 一区二区三区欧美激情| 一区二区三区日韩在线观看| 国产在线观看一区| 在线观看一区| 久久亚洲二区| 一区二区不卡在线视频 午夜欧美不卡'| 日韩视频专区| 亚洲精品视频在线播放| 久久国产欧美精品| 久久久久久久久蜜桃| 国产精品s色| 女仆av观看一区| 国产一区二区福利| 亚洲国产三级网| 午夜精品久久久久久久久久久久| 一区二区在线观看视频| 午夜免费在线观看精品视频| 久久久国际精品| 亚洲黄色尤物视频| 欧美日韩综合在线免费观看| 亚洲精品自在在线观看| 亚洲欧洲一区二区在线观看| 亚洲欧洲日韩综合二区| 久久尤物电影视频在线观看| 欧美成人精品激情在线观看| 久久精品国产亚洲a| 国产精品久久久久9999高清| 亚洲国产日韩欧美在线动漫| 久久久噜久噜久久综合| 欧美一区午夜视频在线观看| 亚洲在线播放| 亚洲国产另类久久久精品极度|