我正在使用 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);
因此,如果您对我有任何建议,我将不胜感激。再次感谢你的帮助。