2

我正在使用 DirectShow.Net 库创建一个过滤器图,该过滤器图使用 http 地址和 WM Asf Writer 流式传输视频。然后在网页上,我可以使用 object 元素在 Windows Media Player 对象中呈现视频源。所以现在我很好奇是否可以使用某种类型的 FilterSource 从该 http 地址读取。我看到有些人将 AsyncReader 用作 IBaseFilter,然后将其转换为 IFileSourceFilter 并调用 load 方法并将其传递给他们的网络的 url。但是我无法使用“http://localhost:8080”的 url 成功地做到这一点。我猜这是因为它不是实际的“文件源”。我尝试在 IFileSourceFilter Load 方法中使用具有 MediaType.URLStream 主要类型和 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);  

因此,如果您对我有任何建议,我将不胜感激。再次感谢你的帮助。

4

1 回答 1

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

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

于 2011-09-20T15:41:51.070 回答