【问题标题】:Is it possible to use an http url as your source location of a Source Filter in DirectShow .Net?是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?
【发布时间】:2011-09-19 19:29:54
【问题描述】:

我正在使用 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);  

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

【问题讨论】:

    标签: c# http directshow networkstream directshow.net


    【解决方案1】:

    经过更多研究,我找到了一些帮助我解决问题的信息。下图是添加了一个源过滤器,其中包含一个 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 项目。如果您遇到同样的问题,希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多