afficher les images d'une cam�ra via http sous bcb c++6
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:
1 2 3 4 5
|
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Soc->Active = true;
} |
Dans le "OnWrite" du Socket:
Code:
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:
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:
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:
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. :aie:
J'attends vos messages ! merci ;)