directx show 的幫助文檔是一個很好的參考資料。可是裡面的很多東西都講得太多了,而我們在開始接觸的時候,都想從最簡單的東西入手,然後逐漸深入,可是參考SDK裡面的例子程序,總是雲裡霧裡,特別是自己動手寫FILTER,要撥開它的叢叢霧水,還真有些不容易。
陸其明老師的《directx show 開發指南》對directx show 有比較經典的講解,從它發表在網上的文章可以看到一部分。很可惜我這地方太落後了,買不到這本書,我也是一個DS的初學者,我想以後還請大家多多指教。
Directx show 的graphedit 是一個很好的filter調試工具,具體位置在..\DXSDK\Bin\DXUtils目錄下。在: 開始->程序->Microsoft directx9.0 sdk->directx utilities 下也能找到該工具,我寫的這個FILTER ,讀者打開該工具後,在菜單:GRAPH->INSERT FILTER打開"WHICH FILTERS DO YOU WANT TO INSERT "對話框,點擊"directxshow filters->Huang RGB Filter"插入即可,然後從"FILE->RENDER MEDIA FILE "打開一個MPG格式的文件,你就可以播放你的影片了,可以通過Huang RGB Filter 改變畫面的顏色。下面就來說說FILTER的事情。
FILTER的種類有三種:
FILTER的連接:(只關心程序的部分實現,不作完全討論)
本例是基於CTransformFilter 的,所以在傳輸的時候,調用的就是CTransformFIlter::Transform(IMediaSample *pSource,IMediaSample *pDest)函數,我們要做的事情,即是將pSource上的數據拷貝到pDest上即可。如果你只是簡單的傳輸一下,例子中的Copy函數即可滿足要求,要在媒體上作修改,只需在pDest上完成。本例參照了SDK的FILTER中的CONSTRAST這個例子改變顏色,本例有很多不足,它不是用來實現什麼完整功能的,他只是一個簡單的例子程序,讓我們自己操作媒體。很有趣吧。
下面講講程序裡的事情:
//IChangeColor implement
STDMETHODIMP Get_RGBColor(BYTE *r,BYTE *g,BYTE *b);
STDMETHODIMP Put_RGBColor(BYTE r,BYTE g,BYTE b);
完成了這兩個方法。 HRESULT CheckInputType(const CMediaType *pmtin);
HRESULT GetMediaType(int iPosition, CMediaType *pMediaType);
HRESULT CheckTransform(const CMediaType *mtin,const CMediaType *mtout);
HRESULT DecideBufferSize(IMemAllocator *pAlloc,ALLOCATOR_PROPERTIES *pProp);
HRESULT Transform(IMediaSample *pin,IMediaSample *pout);
是必須實現的父類CTransformFilter的方法。 void AdjustConstrast(BYTE *r,BYTE *g,BYTE *b);
HRESULT Transform(AM_MEDIA_TYPE *pDest);
HRESULT Transform(IMediaSample *pMediaSample);
HRESULT copy(IMediaSample *pin,IMediaSample *pout);
void ChangeContrast(RGBQUAD *pElem);
是自己寫的函數,主要就是用來改變媒體顏色。 要程序注冊,需要你從新編譯一下。出現注冊成功的對話框後,你就可以用graphedit工具用上面介紹的方法操作了。要編譯成功請根據你的實際情況設定include 和lib 的路徑。
你也可以直接用regsvr32 這個文件這冊我提供給你的..\debug\PropPage.ax。程序環境VC6.0+WIN2000+DX9.0;