2012-03-27 3 views
0

Я пытаюсь создать собственный фильтр графа, и у меня возникают проблемы.DirectShow .NET custom graph

Я использую C# DirectShow.NET Lib

Я читаю файл с VC1 видео и DTS Audio. Я добавляю фильтр источника к графику, он отлично работает, я также могу добавить фильтр сплиттера (используя разделитель 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 возвращает false так же, как если бы не было никаких входных контактов на фильтре.

Смежные вопросы