2017-04-20 11 views
0

Elgato Game Capture HD60을 사용하여 내 응용 프로그램에서 GoPro Hero 5 미리보기 라이브. 이제 스트림을 JPG로 내 폴더에 저장하려고합니다. 그러나 나는 방법을 찾아 낼 수 없다. Elgato Game Capture에서 DirectShow를 사용하여 이미지 저장

는 핀

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 e)를 시작하도록 구속 할 {

//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