Как получить картинку с видео источника

Previous  Top  Next

    
 

 

Для использования следующиего примера необходимо иметь "Microsoft Video for Windows SDK". Пример показывает, как открыть видео устройство для захвата видео, как сграбить фрейм с устройства, как сохранить этот фрейм на диск в виде файла .BMP, как записать .AVI файл (со звуком, но без предварительного просмотра), и как закрыть устройство.

Замечание: Для работы примера необходимо иметь установленное устройство захвата видео (video capture device).

 

Пример:

Code:

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, StdCtrls;

 

type

TForm1 = class(TForm)

   Panel1: TPanel;

   OpenVideo: TButton;

   CloseVideo: TButton;

   GrabFrame: TButton;

   SaveBMP: TButton;

   StartAVI: TButton;

   StopAVI: TButton;

   SaveDialog1: TSaveDialog;

   procedure FormCreate(Sender: TObject);

   procedure OpenVideoClick(Sender: TObject);

   procedure CloseVideoClick(Sender: TObject);

   procedure GrabFrameClick(Sender: TObject);

   procedure SaveBMPClick(Sender: TObject);

   procedure StartAVIClick(Sender: TObject);

   procedure StopAVIClick(Sender: TObject);

private

   { Private declarations }

   hWndC : THandle;

   CapturingAVI : bool;

public

   { Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

const WM_CAP_START                  = WM_USER;

const WM_CAP_STOP                   = WM_CAP_START + 68;

const WM_CAP_DRIVER_CONNECT         = WM_CAP_START + 10;

const WM_CAP_DRIVER_DISCONNECT      = WM_CAP_START + 11;

const WM_CAP_SAVEDIB                = WM_CAP_START + 25;

const WM_CAP_GRAB_FRAME             = WM_CAP_START + 60;

const WM_CAP_SEQUENCE               = WM_CAP_START + 62;

const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START +  20;

 

function capCreateCaptureWindowA(lpszWindowName : PCHAR;

                                dwStyle : longint;

                                x : integer;

                                y : integer;

                                nWidth : integer;

                                nHeight : integer;

                                ParentWin  : HWND;

                                nId : integer): HWND;

                                STDCALL EXTERNAL 'AVICAP32.DLL';

 

procedure TForm1.FormCreate(Sender: TObject);

begin

CapturingAVI := false;

hWndC := 0;

SaveDialog1.Options :=

   [ofHideReadOnly, ofNoChangeDir, ofPathMustExist]

end;

 

procedure TForm1.OpenVideoClick(Sender: TObject);

begin

hWndC := capCreateCaptureWindowA('My Own Capture Window',

                                  WS_CHILD or WS_VISIBLE ,

                                  Panel1.Left,

                                  Panel1.Top,

                                  Panel1.Width,

                                  Panel1.Height,

                                  Form1.Handle,

                                  0);

if hWndC <> 0 then

   SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);

end;

 

procedure TForm1.CloseVideoClick(Sender: TObject);

begin

if hWndC <> 0 then begin

   SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);

  hWndC := 0;

  end;

end;

 

procedure TForm1.GrabFrameClick(Sender: TObject);

begin

if hWndC <> 0 then

   SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);

end;

 

procedure TForm1.SaveBMPClick(Sender: TObject);

begin

if hWndC <> 0 then begin

   SaveDialog1.DefaultExt := 'bmp';

   SaveDialog1.Filter := 'Bitmap files (*.bmp)|*.bmp';

   if SaveDialog1.Execute then

     SendMessage(hWndC,

                 WM_CAP_SAVEDIB,

                 0,

                 longint(pchar(SaveDialog1.FileName)));

end;

end;

 

procedure TForm1.StartAVIClick(Sender: TObject);

begin

if hWndC <> 0 then begin

   SaveDialog1.DefaultExt := 'avi';

   SaveDialog1.Filter := 'AVI files (*.avi)|*.avi';

   if SaveDialog1.Execute then begin

      CapturingAVI := true;

      SendMessage(hWndC,

                  WM_CAP_FILE_SET_CAPTURE_FILEA,

                  0,

                  Longint(pchar(SaveDialog1.FileName)));

      SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);

   end;

end;

end;

 

procedure TForm1.StopAVIClick(Sender: TObject);

begin

if hWndC <> 0 then begin

   SendMessage(hWndC, WM_CAP_STOP, 0, 0);

   CapturingAVI := false;

end;

end;

 

end.

 

 

 

©Drkb::03804

Взято из http://forum.sources.ru