2012-03-27 55 views
0

我正在嘗試構建自定義圖形過濾器,並遇到問題。DirectShow .NET自定義圖形

我現在用的是C#DirectShow.NET LIB

我讀與VC1視頻和DTS音頻文件。我將源過濾器添加到圖中,它工作正常,我也可以添加分離器過濾器(使用lav分離器),但是當我嘗試將文件源過濾器連接到lav分離器時,它失敗。

和失敗,因爲它沒有找到上分器的任何輸入引腳...我知道,輸出引腳可以是動態的,但輸入引腳應該有吧?

這是代碼

_graphBuilder = (IGraphBuilder)new FilterGraph(); 
_dsRotEntry = new DsROTEntry((IFilterGraph)_graphBuilder); 

LogInfo("Adding source filter..."); 
int hr = _graphBuilder.AddSourceFilter(_inputFilePath, _inputFilePath, 
    out _fileSource); 
DsError.ThrowExceptionForHR(hr); 

IPin pinSourceOut = DsFindPin.ByDirection(_fileSource, PinDirection.Output, 0); 
if (pinSourceOut == null) 
{ 
    LogError("Unable to find source output pin"); 
}; 

IBaseFilter lavSplitter = CreateFilter(LAV_SPLITTER); 
if (lavSplitter == null) 
{ 
    LogError("LAV Splitter not found"); 
}; 

hr = _graphBuilder.AddFilter(lavSplitter, "LAV Splitter"); 
DsError.ThrowExceptionForHR(hr); 

bool result = TryConnectToAny(pinSourceOut, lavSplitter); 
if (!result) 
{ 
    LogError("Unable to connect FileSource with LAV Splitter"); 
} 

private bool TryConnectToAny(IPin sourcePin, IBaseFilter destinationFilter) 
{ 
    IEnumPins pinEnum; 
    int hr = destinationFilter.EnumPins(out pinEnum); 
    DsError.ThrowExceptionForHR(hr); 
    IPin[] pins = { null }; 
    while (pinEnum.Next(pins.Length, pins, IntPtr.Zero) == 0) 
    { 
     int err = _graphBuilder.Connect(sourcePin, pins[0]); 
     if (err == 0) 
      return true; 
     Marshal.ReleaseComObject(pins[0]); 
    } 
    return false; 
} 

回答

1

最有可能的輸入引腳確實存在,什麼是失敗的連接本身。 err保存錯誤代碼來解釋問題。如果無法建立連接,則TryConnectToAny返回錯誤的方式與過濾器上根本沒有輸入引腳相同。