DirectShow .NET пользовательский график - PullRequest
0 голосов
/ 27 марта 2012

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

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

Я читаю файл с видео vc1 и dts audio,я добавляю исходный фильтр на график, он работает нормально, я также могу добавить фильтр сплиттера (используя lav splitter), но когда я пытаюсь подключить фильтр исходного файла к 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 Ответ

1 голос
/ 20 сентября 2012

Скорее всего, этот входной контакт существует, а что-то не получается - это само соединение. err содержит код ошибки для возможного объяснения проблемы. Если невозможно установить соединение, TryConnectToAny возвращает false так же, как если бы на фильтре вообще не было входных контактов.

...