Ich versuche, einen benutzerdefinierten Grafikfilter zu erstellen, und ich habe Probleme.DirectShow .NET benutzerdefinierte Grafik
ich die C# DirectShow.NET lib
bin mitIch 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;
}