RenderStream 智能連接Filter

ICaptureGraphBuilder2::RenderStream方法可以同時將兩個或者三個filter連接成一個鏈(chain)。通常情況下,當每個filter只有一個輸出pin和一個輸入pin時,這個方法就才,適用。

  我們現在先忽略前兩個參數,第三個參數是一個IUnknown指針,指向一個filter或者輸出pin。第五,六個參數指向IBaseFilter指針。RenderStream就將三個filter連接成一個鏈。例如,假設A,B,C 是三個filter,每個filter只有一個輸出pin和一個輸入pin。

  下面的代碼可以將B連接到A上,將B連接到C上。

RenderStream(NULL, NULL, A, B, C)
  所有的連接都是智能化的,如果是將兩個filter相連,你可以將中間的參數設置爲NULL:

RenderStream(NULL, NULL, A, NULL, C)
  也可以調用兩次這個函數創建一個更長的鏈條。

RenderStream(NULL, NULL, A, B, C)
RenderStream(NULL, NULL, C, D, E)
  如果最後的一個參數設置爲NULL,這個方法就自動的爲graph設置一個renderer filter。如果是視頻就設置成Video Renderer,如果是音頻就設置爲DirectSoundRenderer。因此RenderStream(NULL, NULL, A, NULL, NULL)等價於 RenderStream(NULL, NULL, A, NULL, R)
這裏R指的是Render Filter。

  如果你在第三個參數指定的是filter,而不是pin,你就要在第一二個參數裏指定使用那個輸出pin用於連接。

  第一個參數只適用於捕捉filter,它指定pin的所屬種類的GUID,具體的設置可以參考Pin Property Set.,但是下面的兩個種類對於所有的filter都有效。

PIN_CATEGORY_CAPTURE
PIN_CATEGORY_PREVIEW
  如果捕捉filter不支持捕捉和預覽,RenderStream方法就增加一個Smart Tee來分割數據流。

  如果播放文件,要將捕捉filter和一個mux filter連接起來,第二個參數指明瞭媒體類型:

MEDIATYPE_Audio
MEDIATYPE_Video
MEDIATYPE_Interleaved (DV)
  查詢filter和pin的接口指針

  當你建立一個graph後,也許你需要查詢graph中的filter和pin暴露的接口指針。例如,一個捕捉filter也許暴露了IAMDroppedFrames接口,它的輸出pin也許暴露了IAMStreamConfig接口。

  查詢接口最簡單地方法就是使用ICaptureGraphBuilder2::FindInterface方法。這個方法遍歷整個graph的filter和pin,直到他找到合適的filter。你可以指定開始的filter,然後指定搜索的方向,(向上搜索還是向下搜索)。

  下面的代碼在一個視頻預覽pin上搜索IAMStreamConfig接口

IAMStreamConfig *pConfig = NULL;
HRESULT hr = pBuild->FindInterface(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pVCap,IID_IAMStreamConfig,
(void**)&pConfig
);
if (SUCCESSFUL(hr))
{
 /* ... */
 pConfig->Release();

轉自:http://apps.hi.baidu.com/share/detail/31638637

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章