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:
Dans le "OnWrite" du Socket:
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 "OnRead":
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 "OnDisconnect":
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 }
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
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"; }
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.
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; }
J'attends vos messages ! merci![]()
Partager