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