我正在使用DirectShow.Net库创建一个过滤器图形,该图形使用http地址和WM Asf Writer来流式传输视频。然后在网页上我可以使用object元素在Windows Media Player对象中呈现视频。所以现在我很好奇是否可以使用某种类型的FilterSource从该http地址读取。我已经看到有些人使用AsyncReader作为IBaseFilter,然后将其作为IFileSourceFilter进行转换并调用load方法并为其网络传递url。但我无法使用“http:// localhost:8080”的网址成功完成此操作。我猜这是因为它不是一个真正的“文件源”。我已经尝试在IFileSourceFilter Load方法中使用带有majorType MediaType.URLStream和SubType of 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);
因此,如果您对我有任何建议,我将不胜感激。再次感谢您的帮助。
答案 0 :(得分: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);
使用通过网络接收器设置的WM Asf Writer过滤器创建tmpStreaming.asf文件。如果您需要一个如何执行此操作的示例,它将作为AsfNet项目在WindowsMediaLib .Net Framework示例中。希望如果您遇到同样的问题,这会有所帮助。