jho*_*ton 3 c# directshow http networkstream directshow.net
我正在使用 DirectShow.Net 库创建一个过滤器图,该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频。然后,在网页上,我可以使用对象元素在 Windows Media Player 对象中呈现视频源。所以现在我很好奇是否可以使用某种类型的 FilterSource 读取该 http 地址。我看到有些人使用 AsyncReader 作为 IBaseFilter,然后将其转换为 IFileSourceFilter 并调用 load 方法并向其传递网络的 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);
Run Code Online (Sandbox Code Playgroud)
因此,如果您对我有任何建议,我将不胜感激。再次感谢你的帮助。
经过更多研究后,我找到了一些可以帮助我解决问题的信息。下面的图表添加了一个以 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);
Run Code Online (Sandbox Code Playgroud)
tmpStreaming.asf 文件是使用通过网络接收器设置的 WM Asf Writer 过滤器创建的。如果您需要有关如何执行此操作的示例,请参阅 WindowsMediaLib .Net Framework 示例中的 AsfNet 项目。如果您遇到同样的问题,希望这会有所帮助。