Можно ли использовать URL-адрес http в качестве исходного местоположения фильтра источника в DirectShow .Net?

Я использую библиотеку DirectShow.Net для создания графа фильтров для потоковой передачи видео с использованием http-адреса и WM Asf Writer. Затем на веб-странице я могу использовать элемент объекта для рендеринга видеопотока в объекте проигрывателя Windows Media. Так что теперь мне любопытно, можно ли читать с этого http-адреса с помощью какого-либо типа FilterSource. Я видел, что некоторые люди используют AsyncReader в качестве IBaseFilter, а затем преобразуют его в IFileSourceFilter, вызывают метод загрузки и передают его URL-адрес для своей сети. Но я не смог успешно сделать это с URL-адресом "http://localhost:8080". Я предполагаю, что это потому, что это не фактический "источник файла". Я попытался использовать AMMediaType с majorType MediaType.URLStream и subType MediaSubType.Asf в методе загрузки IFileSourceFilter, но все же не повезло. Если бы кто-нибудь мог помочь мне разобраться в этом, я бы фигурально поцеловал их, видя, что я работаю над этим уже некоторое время. Пожалуйста, о, пожалуйста, помогите мне.

В моем коде я создаю FilterGraph и CaptureGraph соответственно. Затем создайте экземпляр AsyncReader и приведите его в качестве IBaseFilter. Затем я приведу его в качестве IFileSourceFilter и вызову метод Load, передав ему URL-адрес "http://localhost:8080". Затем добавьте его в FilterGraph. Затем я создаю фильтр рендеринга видео и добавляю его, но когда я пытаюсь вызвать метод RenderStream объекта CaptureGraphBuilder2, он выдает исключение "Неопределенная ошибка". Вот что у меня есть для кода...

            var fGraph = new FilterGraph() as IFilterGraph2;
            var cGraph = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
            cGraph.SetFiltergraph(fGraph);

            var tmp = new AsyncReader() as IBaseFilter;

            //  This is where I tried to load it with a media type.
            //media = new AMMediaType { majorType = MediaType.URLStream, subType = MediaSubType.Asf };
            //((IFileSourceFilter)tmp).Load(_streamingURL, media);
            //DsUtils.FreeAMMediaType(media);

            ((IFileSourceFilter)tmp).Load(_streamingURL, null);

            hr = fGraph.AddFilter(tmp, "SourceFilter");
            DsError.ThrowExceptionForHR(hr);

            var vRender = new VideoRenderer() as IBaseFilter;
            var aRender = new AudioRender() as IBaseFilter;

            hr = fGraph.AddFilter(vRender, "vRenderer");
            DsError.ThrowExceptionForHR(hr);

            hr = cGraph.RenderStream(null, MediaType.Video, tmp, null, vRender); //  This is where it throws an "Unspecified Error".
            DsError.ThrowExceptionForHR(hr);

            hr = fGraph.AddFilter(aRender, "aRenderer");
            DsError.ThrowExceptionForHR(hr);

            hr = cGraph.RenderStream(null, MediaType.Audio, tmp, null, aRender);
            DsError.ThrowExceptionForHR(hr);

            var mcx = fGraph as IMediaControl;
            hr = mcx.Run();
            DsError.ThrowExceptionForHR(hr);  

Так что если у вас есть какие-либо советы для меня, я был бы очень признателен. Еще раз спасибо за вашу помощь.

1 ответ

Решение

После еще одного исследования я смог найти некоторую информацию, которая помогла мне решить мою проблему. Вот график, который добавляет фильтр источника с URL-адресом http в качестве источника, а затем отображает поток в фильтр видео рендеринга и фильтр аудио рендеринга.

            var fGraph = new FilterGraph() as IFilterGraph2;
            var cGraph = new CaptureGraphBuilder2() as ICaptureGraphBuilder2;
            cGraph.SetFiltergraph(fGraph);

            IBaseFilter sourceFilter = null;

            hr = fGraph.AddSourceFilter(@"http://localhost:8080/tempStreaming.asf", "SourceFilter", out sourceFilter);
            DsError.ThrowExceptionForHR(hr);

            var vRender = new VideoRenderer() as IBaseFilter;
            var aRender = new AudioRender() as IBaseFilter;

            hr = fGraph.AddFilter(vRender, "vRenderer");
            DsError.ThrowExceptionForHR(hr);

            hr = cGraph.RenderStream(null, MediaType.Video, sourceFilter, null, vRender);
            DsError.ThrowExceptionForHR(hr);

            hr = fGraph.AddFilter(aRender, "aRenderer");
            DsError.ThrowExceptionForHR(hr);

            hr = cGraph.RenderStream(null, MediaType.Audio, sourceFilter, null, aRender);
            DsError.ThrowExceptionForHR(hr);

            var mcx = fGraph as IMediaControl;
            hr = mcx.Run();
            DsError.ThrowExceptionForHR(hr);

Файл tmpStreaming.asf создается с использованием фильтра WM Asf Writer, настроенного с использованием сетевого приемника. В случае, если вам нужен пример того, как это сделать, он находится в примерах WindowsMediaLib .Net Framework как проект AsfNet. Надеюсь, это поможет, если вы столкнетесь с той же проблемой.

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