directshow filter經驗總結

2021-06-07 03:10:02 字數 2449 閱讀 9174

以前一直做嵌入式,對directshow一點都不明白。所以第一步是進行

餓補。第一步是補vc,以前學過vc,但是好幾年不用了,有點生疏了。

但是功底還不錯,在網上找了些例子練了幾天,感覺找回感覺了。我

認為既然是用vc++程式設計,c++、oop的概念一定要清晰,具備一定的源**

閱讀能力。畢竟directshow filter的**看起來比一般的**要略複雜

一點。如果你隨便開啟乙個directx sdk的例子完全摸不著北的話,建議

先補補基礎知識吧。磨刀不誤砍柴工!

第二步補com,directx是基於com技術的,不說要精通com技術,但是

基本的概念還是要具備的。網上有不少關於com的文章,很多都比較淺顯。

我沒有太深入的去研究com,自我感覺com基本的思想掌握了就放下了。畢竟任務

比較緊,直接殺向最核心內容吧!

第三步補directx,最基本的工具這時候應該都具備了,比如msdn、sourceinsight、

visual assist x、directx sdk等等。說到directx sdk不得不說的是安裝的時候

一定要選用directx sdk 9.0b,而不要用9.0c。9.0c裡面沒有directshow的例子,我

開始就是安裝的9.0c,差點沒ft死。然後就是收集各種資料,補相關知識。directx sdk的

幫助是最基本的,一定要花時間看,畢竟是最權威的。另外很重要的是要買本書看。

現在網路發達了,很多人都不看書直接到網上找資料了。但是我認為如果你對乙個

領域很不熟悉的話,最好是先買本書。一般書上介紹的比較全面,對於入門是相當

好的,而且現在都有光碟,帶例子。我看到版上不少人還沒開始動手就開始問問題,

其實不如先買本書看看,不要開始就看英文書,中文書很多也不錯的。畢竟我們可以

用兩三天就一本中文書看個大概,看完了再去看英文書會更容易理解,尤其是對一些

專業詞彙不熟悉的情況下。另外網上的一些經典文章也可以看看,全面了解一些。

然後可以開始看一些例子。其實不用費心去找,directx sdk自帶的例子就已經很

豐富了。directshow分兩個層次,乙個是用directshow寫應用程式,乙個是寫filter。

igraphbuilder、imediacontrol、imediaseeking、ivideowindow等一堆inte***ce.

ivideowindow設定好顯示視窗的屬性。然後就可以imediacontrol控制run()、pause()、

要更改filter,或者加入一些自己定義的filter,會稍微複雜一些。這個很有點像拚圖,

把這個filter拿下來,換另乙個filter上去。它們之間連線的好不好就要看連線的pin了。

熟悉了之後,該寫自己的filter了。還是先把一些概念吃透吧,然後還是先看directx

sdk的例子,其實裡面各種filter的例子都有(開始有些我還沒注意到)。但是有乙個

至關重要,就是baseclasses。幾乎所有的filter的例子都是基於這個例子中的類的。

你要是把這個例子搞懂了,後面就很容易了。我因為比較著急,看了個大概,就尋了

個例子開始了。後面我就照葫蘆畫瓢,按照乙個splitter filter來做我的filter了。

我這個splitter filter前級是個source filter,后級有兩個pin,乙個接video的render

filter(我把解碼部分直接做到splitter filter裡去了,這樣就不用寫兩個filter了,偷

懶了^_^ ),另乙個接audio decoder,後面是audio output filter. 我的splitter filter

工作在pull模式,負責把資料從source filter讀出來,解碼,然後打上time stamp,包裝

成乙個乙個packet送給後面的filter. 整個流程基本上是初始化,檢測source filter送

過來的檔案(流)的頭,是否是自己識別的格式。初始化基本的引數,並且根據檢測到的資訊

然後就進入上面的傳遞packet的迴圈了。不斷的checkrequest(),如果有的話就deliverpacket().

整個過程就這麼簡單!

這個問題我前面問過。在directx sdk幫助裡有,我直接貼在下面了。

to locate a source filter from a given file name, the filter graph manager attempts to do the following, in order: 

1. match the protocol, if any. 

2. match the file extension. 

3. match patterns of bytes within the file, called check bytes.    

好了,希望這些能對大家有些幫助。

另外,在寫這篇文章之前,我的filter已經完全搞定了,可以交差啦! 

DirectShow Filter除錯方法

介紹經常有人會問,我的filter已經開發好了,但怎麼來除錯呢?怎麼讓程式在filter 上單步執行呢?其實,這個很容易做到。下面我就來講一些具體的步驟吧。正文經常有人會問,我的filter已經開發好了,但怎麼來除錯呢?怎麼讓程式在filter 上單步執行呢?其實,這個很容易做到。下面我就來講一些具...

SOPC Builder Nios學習經驗總結

上的不一致。3.在nois ii中bulid例程hello world都出現了錯誤,錯誤提示為 gdrive c altera kits nios2 components altera nios2 hal src alt busy sleep.c 68 error parse error befor...

directshow filter中新增屬性頁

directshow 屬性頁的製作,為cball filter加了乙個屬性頁 具體為分以下步驟 1.在要顯示屬性的類中繼承現ispecifypropertypages類,並實現此類的getpages 函式。如下所示 hresult stdmethodcalltype cbouncingball ge...