Bonjour à tous,

Je suis actuellement en train de faire un programme dans le cadre de ma formation et je suis incapable de résoudre un problème de récupération des images via une caméra ip.

J'utilise un "client socket" afin d'envoyer les trames HTTP correspondant aux screenshot et dans l'evènement OnRead du socket je traite la récupération du fichier (image).

Néanmoins, lorsque je fais cela en boucle (afin de récupérer les images continuellement et séquentiellement), l'image que je reçois est parfois complétement abimée et déformée. Je rafraichi l'image avec un timer...

Je ne sais absolument pas pourquoi ça me fait cela, si vous avez une solution svp aidez moi.

Voici quelques bout de codes correspondant à ce que j'ai fait:

J'active le timer toutes les N ms:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  Soc->Active = true;
}
Dans le "OnWrite" du Socket:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
void __fastcall TForm1::SocWrite(TObject *Sender, TCustomWinSocket *Socket)
{
        Soc->Socket->SendText("GET /cgi-bin/video.jpg?size=2 HTTP/1.0 \r\n\r\n");
}
Dans le "OnRead":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
void __fastcall TForm1::SocRead(TObject *Sender, TCustomWinSocket *Socket)
{
        char buffer[102000]; // buffer de recuperation des paquets venant du serveur
 
        int nbLu = Socket->ReceiveBuf(buffer, 102000 );  // lire les paquets
        pStream->Write(buffer, nbLu);       // transferer dans le stream
                                              // pour traitement ulterieur
}
Dans le "OnDisconnect":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 
void __fastcall TForm1::SocDisconnect(TObject *Sender,
      TCustomWinSocket *Socket)
{
    i = 0, j = 0;
    int comp;
    unsigned char var[4], var2[4]="ÿØÿÀ", tab;      // À ou þ
 
    pStream->Position = 0;    // pos = 0
    while(pStream->Read(var,4)){
        i+=4;
        comp = strncmp(var,var2,4);
        if(comp == 0) break;
    }
    i-=4;
    pStream->Position = i;
    pStream->Read(var,4);
    pStream->Position = 0;
    while(pStream->Read(&tab,2)){
        j+=2;
        if(!strncmp(&tab,"ÿ",2)){
          pStream->Read(&tab,2);
          j+=2;
          if(!strncmp(&tab,"Ù",1)){
            break;                  //si on a FFD9 on quitte
          }
        }
    }
    tailleImage = j - i;
 
    DisplayImage();   //traite et affiche l'image
    CleanUp();
    btConnect->Caption = "Connecter";
}
Et enfin voici la fonction "DisplayImage()":
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
void __fastcall TForm1::DisplayImage()
{
  unsigned char buf[40000] = "";
 
  try
  {
    pFluxImage->Position = 0;
    pStream->Position = i;  // debut code jpeg après le Header dans le stream
    pStream->Read(buf, tailleImage);
    pFluxImage->Write(buf, tailleImage);
    pFluxImage->Position = 0;
    jp->LoadFromStream(pFluxImage);     // charger le jpeg converti en bitmap
 
    Image1->Picture->Assign(jp); // afficher l'image
 
  }
  catch (...)
  {
    MessageBeep(0);
  }
 
  pFluxImage->Position = 0;
}
Ces instructions sont effectuées séquentiellement. Si vous trouvez une erreur ou quelque chose qui pourrai m'aider à résoudre mon problème svp n'hésitez pas, je suis très à la bourre pour mon projet de fin d'années.

J'attends vos messages ! merci