Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Conexion camara web tscap32 (https://www.clubdelphi.com/foros/showthread.php?t=93191)

LanAndrew 11-06-2018 16:26:54

Conexion camara web tscap32
 
Hola,

Estoy intentando conectar una cámara web a mi proyecto de Delphi de manera que pueda capturar una imagen de lo que se esté viendo en la cámara.

Me he instalado el componente tscap32 y la primera vez que lanzo el proyecto, me veo por la webcam del pc pero si cierro y vuelvo a abrir me salta un mensaje de error que dice amablemente "connect-message was not processed by the capture driver". Tengo Windows 7 de 64 bits... pero si una vez me funciona, no sé por qué no funciona las siguientes veces.

Y mi siguiente prueba es conseguir capturar la imagen que se vea en una cámara web que tengo Icube.

Alguien puede darme un poco de luz para ver más clarito el camino? Por favor!


Atentamente una Andrea desesperada...

Neftali [Germán.Estévez] 11-06-2018 16:44:57

Cita:

Empezado por LanAndrew (Mensaje 527009)
...pero si cierro y vuelvo a abrir me salta un mensaje de error que dice amablemente "connect-message was not processed by the capture driver". Tengo Windows 7 de 64 bits... pero si una vez me funciona, no sé por qué no funciona las siguientes veces.


Te has planteado que ¿tal vez no estés "cerrando" correctamente la conexión con el driver?
De ahí que la segunda vez te esté dando error al conectar.

LanAndrew 12-06-2018 14:36:45

Efectivamente... Tiene pinta de que no se está cerrando pero no sé qué hacer para que se cierre!!

Es más, abro el proyecto y automáticamente me sale la imagen que visualiza la webcam del pc, doy a desconectar la cámara desde la pantalla de delphi, vuelvo a dar a conectar y se abre una ventanita en la que me pide que elija qué cámara quiero usar (solo detecta la webcam) la elijo y me da el error de ayer.

No sé por qué la primera vez que abro el programa detecta la cámara web directamente y una vez que cierro la ventana o desconecto la cámara, la siguiente vez que intento conectar la cámara me pide que elija y al elegirla me da error!

El procedure que utilizo para conectar/desconectar es:
Código Delphi [-]
procedure TtsCap32.SetConnected(status:Boolean);
var
  c: array[0..9]of Char;
begin
  //Beim Lesen der propertywerte existiert das Fenster noch nicht. Der property-
  //wert wird gespeichert und mit ihm wird nach CreateWnd SetConnected erneut aufgerufen
  if (csReading in ComponentState) then begin
    BufConnected := status;
    exit;
  end;

  if (PROHIBITED_STATES*ComponentState)<>[] then exit;

  if status then begin
    if not FConnected and IsWindow(Handle) then
    begin

      //automatische Suche nach einem Treiber:
      if FAutomaticSearchForDriver then
      try
        FDriverNo := AutomaticSearchForDriver;
      except
        //keiner gefunden: Abbruch
        MessageDlg(ERRMSG_GENERAL_OPEN_FAILED, mtError, [mbOk], 0);
        exit;
      end;

      {Capture-Window oeffnen}
      {Meldung:}
      StatusText := '--CONNECTING TO ' + FDriverNameList[FDriverNo] + '...--';
      Paint;
      {Broadcast an alle anderen TTSCAP32-Fenster, die sollen ihre Capturewindow schließen}
      BroadcastToWindows(Handle, 'TtsCap32', ConnectRequCode, FDriverNo, 0);

      StrPCopy(@c, 'TSCap32');
      FhCapWnd := 0;
      FhCapWnd := capCreateCaptureWindowA(@c, (WS_CHILD or WS_VISIBLE),
                                             0, 0, 200, 100, Handle, 0);
      if not IsWindow(FhCapWnd) then tsError('Open the Capturewindow failed', True);

      try
      {Verbindung zum Treiber herstellen}
        if not LongBool(SendMessage(WM_CAP_DRIVER_CONNECT, FDriverNo, 0)) then
          tsError(ERRMSG_CONNECT_FAILED, True) else FConnected := TRUE;
        {Drivercaps holen}
        FDriverCaps.UpdateShownCaps;
        {CapStatus holen}
        GetCaptureStatus;
        {Captureparameter holen}
        GetCaptureParameter;
        {Videoformat holen}
        GetVideoFormat;
        {AudioFormat holen}
        FAudioParameter.LoadAudioFormat;
        {Callbacks einschalten}
        InstallCallbacks(TRUE);
        InstallFrameCallback(FALSE);
        {eingestellte parameter übernehmen}
        ExecuteAll;
        {Größe d. CaptureFensters Updaten}
        Resize;
        StatusText := '--CONNECTED--';
        {Tastatur- und mouse - Messages zum CaptureWindow an Komponente weiterleiten, bitte}
        if IsMessageHookNeeded and not PreventMessageHook then
          tsCap32MessageRedirecter.RegisterHandlePair(self);
        //Userevent OnConnected
        if Assigned(FOnConnected) then FOnConnected(self, TRUE);
        //Userevent OnSync
        SyncExternalCtrls;
      except
        on E: Exception do begin
          {something was wrong. free all and disconnect}
          FConnected := FALSE;
          StatusText := '--DISCONNECTED--';
          DestroyWindow(FhCapWnd);
             FhCapWnd := 0;
   {$IFDEF TSCAP32_GERMAN_VERSION}
             tsError('Fehler bei Treiberanmeldung. Auslösende Exception meldet: '+ E.Message, True);
   {$ELSE}
             tsError('connect failed - exception message: '+ E.Message, True);
   {$ENDIF}
        end;
      end; //Exceptionblock
    end; //!FConnected&&IsWindow
  end //status
  else
  begin
    if FConnected then
    begin
      {Tastatur- und mouse-Message-umleitung aus}
      tsCap32MessageRedirecter.UnRegisterHandlePair(self);
      //nach außen hin ab jetzt disconnected
      FConnected:=FALSE;

      if IsWindow(hCapWnd) then begin
        {Falls Aufnahme am laufen, ausschalten}
        if CapturingNow then CapOrder := stop;
        {Callbacks ausschalten}
        InstallCallbacks(FALSE);
        {Verbindung zum Treiber abbrechen}
        if not LongBool(SendMessage(WM_CAP_DRIVER_DISCONNECT, FDriverNo, 0))then
          tsError('Disconnect failed', False);
        {Fenster killen}
        if (LongBool(DestroyWindow(FhCapWnd)) = FALSE) then
          tsError('CloseWindow failed', False);
      end;
      FSaveRequired := FALSE;
      FhCapWnd:=0;

      {Videoformat loeschen, falls gefüllt}
      if FpVideoFormat<>nil then
      begin
        FreeMem(FpVideoFormat);
        fpVideoFormat := nil;
      end;

      StatusText := '--DISCONNECTED--';
      //Userevent OnConnected
      if Assigned(FOnConnected) then FOnConnected(self, FALSE);
      //neuzeichnen
      Invalidate;
      {Drivercaps auf FALSE updaten}
      FDriverCaps.UpdateShownCaps;
      {Angeschlossenes Popupmenu synchronisieren}
      SyncExternalCtrls;
    end; //FConnected
  end; //!status
end;
Mil gracias de antemano por tu respuesta. Por cierto! Me encanta tu P.D!

Casimiro Notevi 12-06-2018 18:12:55

No olvides poner el código entre sus etiquetas, para que se pueda leer.
Ejemplo:




La franja horaria es GMT +2. Ahora son las 17:16:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi