首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DirectShowLib捕获elgato视频流窗口?

如何使用DirectShowLib捕获elgato视频流窗口?
EN

Stack Overflow用户
提问于 2015-06-20 12:39:19
回答 1查看 1.1K关注 0票数 0

我有埃尔加托捕获设备连接到我的个人电脑,我试图捕捉和观看现场窗口的埃尔加托捕获设备。

我在谷歌搜索并找到了这样的答案:

你能用埃尔加托的HDMIComponent游戏捕捉高清作为视频设备在C#?

这是代码:

代码语言:javascript
复制
IFilterGraph2 graph;
ICaptureGraphBuilder2 captureGraph;
IBaseFilter elgatoFilter;
IBaseFilter smartTeeFilter;
IBaseFilter videoRendererFilter;
Size videoSize;

//Set the video size to use for capture and recording
videoSize = new Size(1280, 720);

//Initialize filter graph and capture graph
graph = (IFilterGraph2)new FilterGraph();
captureGraph = (ICaptureGraphBuilder2)new CaptureGraphBuilder2();
captureGraph.SetFiltergraph(graph);
rot = new DsROTEntry(graph);

//Create filter for Elgato
Guid elgatoGuid = new Guid("39F50F4C-99E1-464A-B6F9-D605B4FB5918");
Type comType = Type.GetTypeFromCLSID(elgatoGuid);
elgatoFilter = (IBaseFilter)Activator.CreateInstance(comType);
graph.AddFilter(elgatoFilter, "Elgato Video Capture Filter");

//Create smart tee filter, add to graph, connect Elgato's video out to smart tee in
smartTeeFilter = (IBaseFilter)new SmartTee();
graph.AddFilter(smartTeeFilter, "Smart Tee");
IPin outPin = GetPin(PinDirection.Output, "Video", elgatoFilter);
IPin inPin = GetPin(PinDirection.Input, smartTeeFilter);
graph.Connect(outPin, inPin);

//Create video renderer filter, add it to graph, connect smartTee Preview pin to video renderer's input pin
videoRendererFilter = (IBaseFilter)new VideoRenderer();
graph.AddFilter(videoRendererFilter, "Video Renderer");
outPin = GetPin(PinDirection.Output, "Preview", smartTeeFilter);
inPin = GetPin(PinDirection.Input, videoRendererFilter);
graph.Connect(outPin, inPin);

//Render stream from video renderer
captureGraph.RenderStream(PinCategory.Preview, MediaType.Video, videoRendererFilter, null, null);

//Set the video preview to be the videoFeed panel
IVideoWindow vw = (IVideoWindow)graph;
vw.put_Owner(videoFeed.Handle);
vw.put_MessageDrain(this.Handle);
vw.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings | WindowStyle.ClipChildren);
vw.SetWindowPosition(0, 0, 1280, 720);

//Start the preview
mediaControl = graph as IMediaControl;
mediaControl.Run();

我在我的项目中创建了一个新表单,并添加了DirectShowLib-2005DLL,然后在新表单的顶部添加了以下内容:

代码语言:javascript
复制
using DirectShowLib;

在构造函数添加全局vars之前:

代码语言:javascript
复制
IFilterGraph2 graph;
ICaptureGraphBuilder2 captureGraph;
IBaseFilter elgatoFilter;
IBaseFilter smartTeeFilter;
IBaseFilter videoRendererFilter;
Size videoSize;

然后在构造函数中,我添加了其余的代码。我现在很少犯错误:

在这一行中,变量rot不存在:

代码语言:javascript
复制
rot = new DsROTEntry(graph);

在使用方法GetPin的四行中,方法GetPin不存在:

代码语言:javascript
复制
IPin outPin = GetPin(PinDirection.Output, "Video", elgatoFilter);
IPin inPin = GetPin(PinDirection.Input, smartTeeFilter);
outPin = GetPin(PinDirection.Output, "Preview", smartTeeFilter);
inPin = GetPin(PinDirection.Input, videoRendererFilter);

在这条线上:

代码语言:javascript
复制
vw.put_Owner(videoFeed.Handle);

变量videoFeed不存在。

最后这两行:

代码语言:javascript
复制
mediaControl = graph as IMediaControl;
mediaControl.Run();

mediaControl不存在。

我错过了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-20 12:55:45

videoFeed是您的控件,用于托管您正在嵌入的视频。

mediaControl将是IMediaControl类型的变量。

代码语言:javascript
复制
IMediaControl mediaControl = graph as IMediaControl;
mediaControl.Run();

GetPin或类似的;DsROTEntry不是强制性的,而是使用GraphEdit或类似工具的帮助外部检查过滤图

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30954127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档