Посмотри как сделано у меня ...
Уровень ближе к системному и хотя пока кривовато
(Постоянно "Хлопаю драйвером" и юзаю клипборд ) но может какие-то идеи появятся...)
- Код: Выделить всё
// Захват кадра
function capCreateCaptureWindow
(lpszWindowName : PChar; dwStyle : Integer; x : Integer; y : Integer;
nWidth : Integer; nHeight : Integer; hWndParent : Integer; nID : Integer)
: Integer; stdcall; external 'avicap32.dll' name 'capCreateCaptureWindowA';
procedure TMainForm.Button2Click(Sender: TObject);
const
WM_USER = $00000400;
WM_CAP_START = WM_USER; //старт для сообщений
WM_CAP_GET_CAPSTREAMPTR = WM_CAP_START + 1;
//описание callback ошибок
WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
WM_CAP_SET_CALLBACK_STATUS = WM_CAP_START + 3;
WM_CAP_SET_CALLBACK_YIELD = WM_CAP_START + 4;
WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
WM_CAP_SET_CALLBACK_WAVESTREAM = WM_CAP_START + 7;
WM_CAP_GET_USER_DATA = WM_CAP_START + 8;
WM_CAP_SET_USER_DATA = WM_CAP_START + 9;
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
WM_CAP_DRIVER_GET_NAME = WM_CAP_START + 12;
WM_CAP_DRIVER_GET_VERSION = WM_CAP_START + 13;
WM_CAP_DRIVER_GET_CAPS = WM_CAP_START + 14;
WM_CAP_FILE_SET_CAPTURE_FILE = WM_CAP_START + 20;
WM_CAP_FILE_GET_CAPTURE_FILE = WM_CAP_START + 21;
WM_CAP_FILE_SAVEAS = WM_CAP_START + 23;
WM_CAP_FILE_SAVEDIB = WM_CAP_START + 25;
WM_CAP_FILE_ALLOCATE = WM_CAP_START + 22;
WM_CAP_FILE_SET_INFOCHUNK = WM_CAP_START + 24;
WM_CAP_EDIT_COPY = WM_CAP_START + 30;
WM_CAP_SET_AUDIOFORMAT = WM_CAP_START + 35;
WM_CAP_GET_AUDIOFORMAT = WM_CAP_START + 36;
WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44;
WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45;
WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
WM_CAP_SET_SCALE = WM_CAP_START + 53;
WM_CAP_GET_STATUS = WM_CAP_START + 54;
WM_CAP_SET_SCROLL = WM_CAP_START + 55;
WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
WM_CAP_GRAB_FRAME_NOSTOP = WM_CAP_START + 61;
WM_CAP_SEQUENCE = WM_CAP_START + 62;
WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
WM_CAP_SET_SEQUENCE_SETUP = WM_CAP_START + 64;
WM_CAP_GET_SEQUENCE_SETUP = WM_CAP_START + 65;
WM_CAP_SET_MCI_DEVICE = WM_CAP_START + 66;
WM_CAP_GET_MCI_DEVICE = WM_CAP_START + 67;
WM_CAP_STOP = WM_CAP_START + 68;
WM_CAP_ABORT = WM_CAP_START + 69;
WM_CAP_SINGLE_FRAME_OPEN = WM_CAP_START + 70;
WM_CAP_SINGLE_FRAME_CLOSE = WM_CAP_START + 71;
WM_CAP_SINGLE_FRAME = WM_CAP_START + 72;
WM_CAP_PAL_OPEN = WM_CAP_START + 80;
WM_CAP_PAL_SAVE = WM_CAP_START + 81;
WM_CAP_PAL_PASTE = WM_CAP_START + 82;
WM_CAP_PAL_AUTOCREATE = WM_CAP_START + 83;
WM_CAP_PAL_MANUALCREATE = WM_CAP_START + 84;
// Following added post VFW 1.1
WM_CAP_SET_CALLBACK_CAPCONTROL = WM_CAP_START + 85;
CONTROLCALLBACK_PREROLL = 1 ; //* Waiting to start capture */
CONTROLCALLBACK_CAPTURING = 2 ; //* Now capturing */
hCamCapture : Integer=0;
Var
hHandle:HWND;
fRefreshRate: integer;
fViewStyle: integer;
r: TRect;
ID: TGUID;
S: string;
function CapControlCallback (Hwnd, nState:dword): dword; stdcall;
//var pCls: THIWebCam;
begin
// pCls := THIWebCam(GetProp(hwnd, PChar('OwnerObject')));
Result := nState;
end;
begin
// Пока не разобраться как обойти Panel2 обычная пустая панель
// по хорошему там должно показаться превью ...
hHandle := self.Panel2.Handle;
// Connect;
R:= self.Panel2.ReadBounds;
S := 'WebCam_' + intTostr(LongInt(Self));
if hCamCapture = 0 then begin
hCamCapture := capCreateCaptureWindow(PChar(S),
WS_VISIBLE OR WS_CHILD OR WS_CLIPSIBLINGS,
0, 0, r.right-r.left, r.bottom-r.top, hHandle, LongInt(self));
SetProp(hCamCapture,PChar('OwnerObject'), integer(pointer(self)));
SendMessage(hCamCapture, WM_CAP_DRIVER_CONNECT, 0, 0);
SendMessage(hCamCapture, WM_CAP_SET_OVERLAY, 0, 0);
SendMessage(hCamCapture, WM_CAP_SET_PREVIEW, 1, 0);
SendMessage(hCamCapture, WM_CAP_SET_SCALE, fViewStyle, 0);
SendMessage(hCamCapture, WM_CAP_SET_PREVIEWRATE, fRefreshRate, 25);
// SendMessage(hCamCapture, WM_CAP_SET_CALLBACK_CAPCONTROL
// , 0, longint(@CapControlCallback));
end;
SendMessage(hCamCapture, WM_CAP_EDIT_COPY, 0, 0);
// Захватывает в Imag1.. (Обычный TImage)
Imag1.Picture.Bitmap.LoadFromClipboardFormat(2);
// .LoadFromClipboardFormat (ctClipboard);
// Тормоз тут ...
SendMessage(hCamCapture, WM_CAP_DRIVER_DISCONNECT, 0, 0);
DestroyWindow(hCamCapture);
hCamCapture := 0;
// ...но для захвата одного кадра нормально
end;
ЗЫ
На всяк случай мой uses..
uses
Windows, Classes, SysUtils, FileUtil, {uPSComponent, ну это для скриптов} Forms, Controls, Graphics,
Dialogs, ExtCtrls, StdCtrls, Buttons, ComCtrls,LCLType;