2012-03-27 6 views
0

Ich versuche, einen benutzerdefinierten Grafikfilter zu erstellen, und ich habe Probleme.DirectShow .NET benutzerdefinierte Grafik

ich die C# DirectShow.NET lib

bin mit

Ich lese eine Datei mit VC1 Video und dts-Audio. Ich füge den Quellfilter dem Graph hinzu, es funktioniert gut, ich kann auch den Splitterfilter hinzufügen (mit Lavsplitter), aber wenn ich versuche, den Dateiquellenfilter mit dem Lavsplitter zu verbinden, schlägt es fehl.

und es schlägt fehl, weil es keinen Eingang Pin auf dem Splitter findet ... Ich weiß, dass Ausgang Pins dynamisch sein können, aber der Eingang Pin sollte da sein, richtig?

Dies ist der Code

_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"); 
} 

und

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; 
} 

Antwort

1

Die meisten wahrscheinlich, dass Eingabestift vorhanden ist, und was ist die Verbindung fehlschlägt sich. err enthält einen Fehlercode, um das Problem möglicherweise zu erklären. Wenn die Verbindung nicht hergestellt werden kann, gibt TryConnectToAny false auf die gleiche Weise zurück, als ob überhaupt keine Eingangspins am Filter vorhanden wären.