Ver Mensaje Individual
  #1  
Antiguo 09-11-2022
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Reputación: 20
elcigarra Va por buen camino
Dos cámaras en paralelo

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.
Responder Con Cita