0

我使用 Elgato Game Capture HD60 在我的应用程序中实时预览 GoPro Hero 5。现在我想在我的文件夹中将流保存为 JPG。但我不知道怎么做。

绑定引脚

    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;
    }

并开始流

私人无效按钮1_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();

}

4

1 回答 1

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

于 2017-06-27T08:47:33.760 回答