DirectShow - фильтры подключаются в GraphEdit, но не в моем приложении

У меня есть приложение C#, которое должно построить граф DirectShow для рендеринга видеопотока в кодировке H.264. Я использую DirectShowLib как управляемую оболочку. Я уже работал с различными фильтрами для RTSP Source и H.264 (Проект обработки видео, DivX, Datastead, ...), но недавно я наткнулся на фильтры MontiVision, упомянутые здесь. Я попробовал их в GraphStudio и был очень доволен их производительностью, поэтому я хотел использовать их в своем приложении.

Странная вещь, хотя фильтры "Источник MV потока" и "MV Video Decoder" легко подключаются в GraphStudio (после установки URL-адреса RTSP), когда я пытаюсь сделать то же самое в C#, я получаю HRESULT VFW_E_NO_ACCEPTABLE_TYPES при попытке подключить те же фильтры. "MV Stream Source" выводит медиатип AVC1, я не знаю, какой медиатип принимает "MV Video Decoder", но когда я подключаю фильтры в GraphStudio, кажется, что он принимает AVC1.

Я уверен, что имена выводов и GUID верны (так же, как в GraphStudio). Я также пытался ждать (Thread.Sleep) до 10 секунд между созданием фильтра и подключением, но безрезультатно.

У кого-нибудь есть идея, что я могу делать неправильно? Спасибо!

Код для подключения фильтров выглядит следующим образом:

int hr = 0;

//add Source Filter 
hr = pGraph.AddFilter(pSourceFilter, "Source Filter");
DsHelper.checkHR(hr, "Can't add Source Filter to graph");


//set source filename 
IFileSourceFilter pVideoSourceFilter_src = pSourceFilter as IFileSourceFilter;
if (pVideoSourceFilter_src == null)
    DsHelper.checkHR(unchecked((int)0x80004002), "Can't get IFileSourceFilter");

hr = pVideoSourceFilter_src.Load(srcFile, null);

DsHelper.checkHR(hr, "Can't load file");

//add Video Decoder 
hr = pGraph.AddFilter(pVideoDecoder, "Video Decoder");
DsHelper.checkHR(hr, "Can't add Video Decoder to graph");

//add Video Renderer 
IBaseFilter pVideoRenderer = DsHelper.FilterFromGUID(DsHelper.CLSID_NullRenderer);
hr = pGraph.AddFilter(pVideoRenderer, "Video Renderer");
DsHelper.checkHR(hr, "Can't add Video Renderer to graph");

        //connect Source Filter and Video Decoder 
hr = pGraph.ConnectDirect(DsHelper.GetPin(pSourceFilter, srcFilterVideoOutName), DsHelper.GetPin(pVideoDecoder, vdVideoInName), null);
DsHelper.checkHR(hr, "Can't connect Source Filter and Video Decoder");

Создание фильтров:

IBaseFilter pSourceFilter = (IBaseFilter)DsHelper.FilterFromGUID(DsHelper.CLSID_MVRTSPSourceFilter);
IBaseFilter pVideoDecoder = (IBaseFilter)DsHelper.FilterFromGUID(DsHelper.CLSID_MVDecoder);

Помощники:

public static Guid CLSID_MVDecoder = new Guid("{D8F0E4C9-38DB-40E7-93C3-248A22D587B8}");
public static Guid CLSID_MVRTSPSourceFilter = new Guid("{EDE234EC-157E-4516-9AC5-0F401384918B}");
public static IBaseFilter FilterFromGUID(Guid filterGuid)
    {
        return (IBaseFilter)Activator.CreateInstance(Type.GetTypeFromCLSID(filterGuid));
    }

public static IPin GetPin(IBaseFilter filter, string pinname)
    {
        IEnumPins epins;
        int hr = filter.EnumPins(out epins);
        checkHR(hr, "Can't enumerate pins");
        IntPtr fetched = Marshal.AllocCoTaskMem(4);
        IPin[] pins = new IPin[1];
        while (epins.Next(1, pins, fetched) == 0)
        {
            PinInfo pinfo;
            pins[0].QueryPinInfo(out pinfo);
            bool found = (pinfo.name == pinname);
            DsUtils.FreePinInfo(pinfo);
            if (found) return pins[0];
        }
        checkHR(-1, "Pin not found: " + pinname);
        return null;
    }

0 ответов

Другие вопросы по тегам