Захват неподвижного изображения с помощью Microsoft Expression Encoder SDK

Я играл с моей веб-камерой и начал создавать небольшое приложение (с использованием Microsoft Expression Encoder SDK), где изображения с веб-камеры передаются в видеоблок на winform [1]. Пока что все прошло довольно гладко. Но теперь моя проблема начинается:

Я хочу захватить одно изображение из видеопотока и сохранить его. Я нашел класс "ScreenCaptureJob", который может создавать видеофайлы. MSDN Microsoft заявляет, что можно "захватить что-либо из неподвижного изображения диалогового окна" [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

2 ответа

Вы можете использовать библиотеку для захвата неподвижного изображения, но, похоже, это нечто вроде клуджа. (Я все еще ищу лучшее решение) Я нашел пример по ссылке. Основное решение - открыть окно предварительного просмотра, а затем, используя графический объект того же размера, использовать CopyFromScreen(), чтобы получить файл.

Вы можете, но это кажется чем-то вроде клуджа. Я нашел пример в Code Project - Как использовать веб-камеру в 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(....)
    }

Я не уверен, возможно ли это с помощью 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, пожалуйста, дайте мне знать.

Другие вопросы по тегам