-1

我正在玩我的网络摄像头并开始创建一个小应用程序(使用 Microsoft Expression Encoder SDK),其中网络摄像头的图像被流式传输到 winform [1] 上的图片框。到目前为止,一切都很顺利。但现在我的问题开始了:

我想捕获视频流的单个图像并将其存储。我找到了能够创建视频文件的“ScreenCaptureJob”类。微软的 MSDN 声明可以“从对话框的静止图像中捕获任何内容”[2] 以完成视频。MSDN 中的所有示例均指视频捕获。不幸的是,我找不到任何解决方案如何使用此类捕获单个图像。

谁能帮我?

[1] 将网络摄像头流式传输到图片框的代码(来源: http: //www.codeproject.com/Articles/202464/How-to-use-a-WebCam-in-C-with-the-NET-Framework-4 )

        var lstVideoDevices = new Dictionary<string, EncoderDevice>();
        var lstAudioDevices = new Dictionary<string, EncoderDevice>();

        foreach (EncoderDevice edv in EncoderDevices.FindDevices(EncoderDeviceType.Video))
        {
            lstVideoDevices.Add(edv.Name, edv);
        }
        foreach (EncoderDevice eda in EncoderDevices.FindDevices(EncoderDeviceType.Audio))
        {
            lstAudioDevices.Add(eda.Name, eda);
        }

        _job = new 

        var _deviceSource = _job.AddDeviceSource(lstVideoDevices.Values.FirstOrDefault(x => x.Name.Contains("USB")), lstAudioDevices.Values.FirstOrDefault(x => x.Name.Contains("USB")));

        _deviceSource.PreviewWindow = new PreviewWindow(new HandleRef(this.pictureBox1, this.pictureBox1.Handle));

        _job.ActivateSource(_deviceSource);`

[2] http://msdn.microsoft.com/en-us/library/gg602440%28v=expression.40%29.aspx

4

2 回答 2

2

您可以使用该库进行静态捕获,但它似乎有点杂乱无章。(我还在寻找更好的解决方案)我在链接 中找到了一个示例 基本解决方案是弹出一个预览窗口,然后使用相同尺寸的图形对象,使用 CopyFromScreen() 获取文件。

你可以,但它似乎有点杂乱无章。我在Code Project-How To Use A Webcam in C# 中找到了一个示例, 基本的解决方案是弹出一个预览窗口。然后,使用相同尺寸的图形对象,使用 CopyFromScreen() 获取文件。这是代码:

using (Bitmap bitmap = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height))
   { 
   using (Graphics g = Graphics.FromImage(bitmap))
    {
        // Get the paramters to call g.CopyFromScreen and get the image
        Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
        Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
        g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size); 
    }
    bitmap.Save(....)
    }
于 2013-09-10T06:09:29.110 回答
1

我不确定是否可以使用 Microsoft Expression Encoder SDK,它似乎没有很好的文档记录。

但您可以改用视频捕捉功能。

只需使用函数创建一个预览窗口capCreateCaptureWindow,然后通过发送WM_CAP_SET_CALLBACK_FRAME消息注册帧回调:

/* imports */
[DllImport("user32", EntryPoint="SendMessage")]
public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

[DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindowA")]
public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

/* ... */
capCreateCaptureWindowA(lpszName, showVideo.WS_VISIBLE | showVideo.WS_CHILD, 0, 0, mWidth, mHeight, mControlPtr, 0);

SendMessage(lwnd, showVideo.WM_CAP_SET_CALLBACK_FRAME, 0, handler);

您可以在此处此处找到 C# 示例。

如果您知道如何使用 Expression Encoder 做到这一点,请告诉我。

于 2013-05-05T15:04:17.310 回答