Estimados, estoy intentando hacer una aplicación en DXE3, que necesita capturar video, en principio de 2 cámaras (que pueden ser la misma mostrada dos veces). Como no sé nada del tema de video, encontré en internet un código bastante simple con el que se podía capturar una cámara que funciona bien (en realidad más que capturar la cámara toma fotogramas con un timer y los muestra en un TPanel.
Para el objetivo de las dos cámaras, lo que hice fue duplicar las partes relevantes y el timer para mostrar las dos capturas, pero lo que me pasa es que solo se ve una y la otra se muestra un plano verde. Les pongo el código a ver qué opinan.
Código:
unit TwoCamsMain;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls,
StdCtrls,Menus, Buttons;
const
WM_CAP_START = WM_USER;
WM_CAP_STOP = WM_CAP_START+68;
WM_CAP_DRIVER_CONNECT = WM_CAP_START+10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START+11;
WM_CAP_SAVEDIB = WM_CAP_START+25;
WM_CAP_GRAB_FRAME = WM_CAP_START+60;
WM_CAP_SEQUENCE = WM_CAP_START+62;
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START+20;
type
TForm1 = class(TForm)
Timer1: TTimer;
Panel1: TPanel;
Panel2: TPanel;
Timer2: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
private
hWndC:THandle;
hWndC_B:THandle;
FPS:integer;
procedure ConectarDrive;
procedure CreaHandle;
procedure DesconectarDrive;
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
function capCreateCaptureWindowA(lpszWindowName : PCHAR;
dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
STDCALL EXTERNAL 'AVICAP32.DLL';
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
FPS:=24;
Timer1.Interval:=1000 div FPS;
Timer2.Interval:=1000 div FPS;
hWndC:=0;
hWndC_B:=0;
CreaHandle;
ConectarDrive;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Application.ProcessMessages;
if hWndC<>0 then begin
SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0);
Timer1.Enabled:=True;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
// Application.ProcessMessages;
if hWndC_B<>0 then begin
SendMessage(hWndC_B, WM_CAP_GRAB_FRAME, 0, 0);
Timer2.Enabled:=True;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DesconectarDrive;
end;
procedure TForm1.CreaHandle;
begin
try
hWndC:=capCreateCaptureWindowA(' Video',
WS_CHILD or WS_VISIBLE,
0,
0,
Width,
Height,
Panel1.Handle,
0);
hWndC_B:=capCreateCaptureWindowA(' Video',
WS_CHILD or WS_VISIBLE,
0,
0,
Width,
Height,
Panel2.Handle,
0);
except
ShowMessage('error en handle');
end;
end;
procedure TForm1.ConectarDrive;
begin
try
if hWndC<>0 then begin
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
end;
if hWndC_B<>0 then begin
SendMessage(hWndC_B, WM_CAP_DRIVER_CONNECT, 0, 0);
end;
Timer1.Enabled:=True;
Timer2.Enabled:=True;
except
ShowMessage('error al desconectar'); // error mesg
end;
end;
procedure TForm1.DesconectarDrive; // Disconnect
begin
try
if hWndC<>0 then begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC:=0;
SendMessage(hWndC_B, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC_B:=0;
end;
except
ShowMessage('error al desconectar'); // error message
end;
end;
end.