2012-03-27 67 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返回错误的方式与过滤器上根本没有输入引脚相同。