gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:29:02 24 4
gpt4 key购买 nike

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

在我的代码中,我相应地创建了 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);

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

最佳答案

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

关于c# - 是否可以在 DirectShow .Net 中使用 http url 作为源过滤器的源位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7476252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com