2017-04-20 78 views
0

使用Elgato Game Capture HD60在我的应用程序中预览GoPro Hero 5。现在我想将流保存为我的文件夹中的JPG。但我不知道如何。使用DirectShow保存来自Elgato Game Capture的图像

要绑定销

DsROTEntry rot; //Used for remotely connecting to graph 
    IFilterGraph2 graph; 
    ICaptureGraphBuilder2 captureGraph; 
    IBaseFilter elgatoFilter; 
    IBaseFilter smartTeeFilter; 
    IBaseFilter videoRendererFilter; 
    Size videoSize; 

    private IPin GetPin(PinDirection pinDir, IBaseFilter filter) 
    { 
     IEnumPins epins; 
     int hr = filter.EnumPins(out epins); 
     if (hr < 0) 
      return null; 
     IntPtr fetched = Marshal.AllocCoTaskMem(4); 
     IPin[] pins = new IPin[1]; 
     epins.Reset(); 
     while (epins.Next(1, pins, fetched) == 0) 
     { 
      PinInfo pinfo; 
      pins[0].QueryPinInfo(out pinfo); 
      bool found = (pinfo.dir == pinDir); 
      DsUtils.FreePinInfo(pinfo); 
      if (found) 
       return pins[0]; 
     } 
     return null; 
    } 

    private IPin GetPin(PinDirection pinDir, string name, IBaseFilter filter) 
    { 
     IEnumPins epins; 
     int hr = filter.EnumPins(out epins); 
     if (hr < 0) 
      return null; 
     IntPtr fetched = Marshal.AllocCoTaskMem(4); 
     IPin[] pins = new IPin[1]; 
     epins.Reset(); 
     while (epins.Next(1, pins, fetched) == 0) 
     { 
      PinInfo pinfo; 
      pins[0].QueryPinInfo(out pinfo); 
      bool found = (pinfo.dir == pinDir && pinfo.name == name); 
      DsUtils.FreePinInfo(pinfo); 
      if (found) 
       return pins[0]; 
     } 
     return null; 
    } 

并启动流

私人无效的button1_Click(对象发件人,EventArgs的) {

//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(pictureBox1.Handle); 
vw.put_MessageDrain(this.Handle); 
vw.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings | WindowStyle.ClipChildren); 
vw.SetWindowPosition(0, 0, 1280, 720); 

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

}

回答

0

您可以成功运行过滤器图表,并且哪一步获得了错误信息?
您可以通过示例代码\Samples\Capture\PlayCap了解如何构建视频捕获过滤器图。
如果您想获得视频快照,可以在\Samples\Capture\DxSnap处获取示例代码。
您可以修改视频源索引和视频快照大小以获得所需内容。
const int VIDEODEVICE = 0; // zero based index of video capture device to use const int VIDEOWIDTH = 2048; // Depends on video device caps const int VIDEOHEIGHT = 1536; // Depends on video device caps const int VIDEOBITSPERPIXEL = 24; // BitsPerPixel values determined by device