是否可以使用http url作为DirectShow .Net中源过滤器的源位置?

时间:2011-09-19 19:29:54

标签: c# http directshow networkstream directshow.net

我正在使用DirectShow.Net库创建一个过滤器图形,该图形使用http地址和WM Asf Writer来流式传输视频。然后在网页上我可以使用object元素在Windows Media Player对象中呈现视频。所以现在我很好奇是否可以使用某种类型的FilterSource从该http地址读取。我已经看到有些人使用AsyncReader作为IBaseFilter,然后将其作为IFileSourceFilter进行转换并调用load方法并为其网络传递url。但我无法使用“http:// localhost:8080”的网址成功完成此操作。我猜这是因为它不是一个真正的“文件源”。我已经尝试在IFileSourceFilter Load方法中使用带有majorType MediaType.URLStream和SubType of MediaSubType.Asf的AMMediaType,但仍然没有运气。如果有人可以帮我解决这个问题,我会比喻亲吻他们,因为我已经有一段时间了。请噢,请帮助我。

在我的代码中,我正在相应地创建FilterGraph和CaptureGraph。然后创建一个AsyncReader实例并将其转换为IBaseFilter。接下来,我将其转换为IFileSourceFilter并调用Load方法,将其传递给“http:// localhost:8080”url。然后将其添加到FilterGraph。然后我创建视频渲染过滤器并添加它,但是当我尝试调用CaptureGraphBuilder2对象的RenderStream方法时,它会抛出“未指定的错误”异常。以下是我对代码的看法......

            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 个答案:

答案 0 :(得分:4)

经过一些研究后,我找到了一些帮助我解决问题的信息。下面是使用http url添加源过滤器作为源的图表,然后将流呈现为视频渲染器过滤器和音频渲染过滤器。

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

使用通过网络接收器设置的WM Asf Writer过滤器创建tmpStreaming.asf文件。如果您需要一个如何执行此操作的示例,它将作为AsfNet项目在WindowsMediaLib .Net Framework示例中。希望如果您遇到同样的问题,这会有所帮助。