2017-04-20 17 views
0

私のアプリケーションでは、Elgato Game Capture HD60を使用してGoPro Hero 5を予報しています。今私は自分のフォルダ内のJPGとしてストリームを保存したい。しかし、私は方法を見つけることができません。DirectShowを使用してElgato Game Captureから画像を保存

{

//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(); 

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の電子)するには

}

答えて

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

関連する問題