IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Viewer caméra H264 suivant son Ip


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut Viewer caméra H264 suivant son Ip
    Bonjour à toutes et à tous,

    Quelqu'un aurait t'il dans ses sources un exemple pour afficher sur un Tpanel ou Timage une caméra Hd 2MP à partir de son Ip donc pas une webcam ?

    Ou un composant pour D6 à installer.

    J'ai bien une source en .net mais je ne suis pas capable de la convertir en Delphi.

    J'ai aussi une source en html qui m'affiche bien ma caméra en direct mais elle fait appel au lecteur QuickTime.

    Merci de me tenir au courant.

    @+,

    cincap

  2. #2
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    bonjour
    j'ai pas les source sous les main, mais, si tu regarde les source de fichier html, tu trouveras le début de réponse,
    si ma mémoire est bon, il te faut un composant socket, tu reçoit une trame de donnée qui contient un jpeg, que tu peut afficher avec un ritme de 10 à 20 image/s
    bon dev
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @edam, merci pour ta réponse, en Delphi j'avais utilisé le TWebbrowser pour afficher la caméra suivant son Ip, cela fonctionne en direct.

    Mais le souci, je dois charger l'activeX du lecteur QuickTime et cela me semble assez lourd car à un moment, l'image en direct se fige.

    Sinon je n'ai pas bien compris ta suggestion.

    Mon code en html, "document.writein est indispensable dans le code :

    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
     
    <html> 
     
    <head> 
     
    <title>Viewer H264</title> 
     
    </head> 
     
    <body> 
     
     <form name = "Caméra arrière"> 
     
       <script language="JavaScript"> 
     
    //1920 x 1080 ou 1535 x 740
     
      document.writeln('<OBJECT CLASSID="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" width=' + 1535 + 
     
          ' height=' + 740 + ' CODEBASE="http://www.apple.com/qtactivex/qtplugin.cab">'); 
     
      document.writeln('<param name="autoplay" value="true">'); 
     
      document.writeln('<param name="controller" value="true">'); 
     
     //H.264 over RTSP over 554 port  
     
         document.writeln('<param name="qtsrc" value="' + 'rtsp://192.168.1.12:554/user=admin&password=&channel=1&stream=0.sdp?real_stream' + '">'); 
     
      </script>  
     
    </body>
    </html>
    L'idéal ce serait de l'afficher dans un conteneur comme Tmed ou Vcap ou un simple panel ?

    @+,

    cincap

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Cincap, tu veux te débarrasser du TWebBrowser Utilisation d'une caméra avec un TWebBrowser et capture d'écran

    tu peux directement utiliser l'activeX "02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" en Delphi sans passer une page web
    Utilise le générateur de composant ActiveX

    Citation Envoyé par edam Voir le message
    , il te faut un composant socket, tu reçoit une trame de donnée qui contient un jpeg, que tu peut afficher avec un ritme de 10 à 20 image/s
    C'est ce qui s'appelle je "JPEG Motion"
    Le M-JPEG peut être capturé par des api DirectShow qui ce connecte en "HTTP://IP:Port"

    Perso, je ne l'ai fait qu'avec de l'AXIS qui fourni un ActiveX et Dahua qui fourni un SDK complet pour les professionnels qui supporte le M-JPEG et le AVI H.264
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll merci de ton message.

    Ce que je n'arrive pas à comprendre c'est sur quel composant que l'affichage de ma caméra se fera et si c'est en image fixe ou comme avec le fichier html en temps réel.

    Avec la source C++, j'ai la vue de 4 caméras et un Tlist qui me permet de voir l'ip de chaque caméra, dès que l'ip est trouvée, la caméra s'affiche en temps réel comme avec le fichier html.

    Je peus la communiquer.

    J'ai aussi la dll "build_ffmpeg_shared_64" à placer dans le dossier de l'application.

    Voila voilou.

    @+,

    cincap

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Le code C++ serait certainement utile pour comprendre comment faire.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    @ tourlourou,

    Voici le code pour l'application "Client Demo" qui permet d'afficher 4 caméras en les additionnant dans un Tlist suivant leur Ip, prévenir si il manque un fichier.

    J'ai constaté que le Sdk de Dahua relaté par ShaiLeTroll est le même que Golbong fournisseur de mes caméras H264, la seule différence que les fichiers *.exe fonctionnent avec la source Golbong,

    et non avec la source Dahua, je pense que c'est bien du C++ !

    Perso, je ne l'ai fait qu'avec de l'AXIS qui fourni un ActiveX et Dahua qui fourni un SDK complet pour les professionnels qui supporte le M-JPEG et le AVI H.264
    @+,

    cincap
    Fichiers attachés Fichiers attachés

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    Avec ce code j'arrive à créer une série d'image en JPG mais je ne sais pas les afficher dans le Timage et depuis le dossier je ne sais pas lire les images avec le viewer Microsoft.

    Edurl.text = 192.168.1.12

    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
     
    procedure TForm1.BokClick(Sender: TObject);
    var 
      FS: TFileStream; 
      Url, FileName: String; 
      I: Integer; 
    begin 
      for I := 7400 to 7500 do
      begin 
        Url := Edurl.text + IntToStr(I) +  '.jpg';
        FileName := 'C:\Data\Delphi\Web\navigweb\Test\V4\Caméra arrière' + IntToStr(I) + '.jpg';
        //ImCamAR.picture.loadfromfile('Caméra arrière' + IntToStr(I) + '.jpg');
        FS := TFileStream.Create(FileName, fmCreate);
        try
          try
            try
              IdHTTP1.Get(Url, FS);
            except
              on E: EIdHTTPProtocolException do 
                Continue;
            end;
            Application.ProcessMessages;
          finally
            Fs.Free;
          end;
        except
          DeleteFile(FileName);
        end;
      end;
     
     
    end;
    Je continue mes recherches.

    @+,

    cincap

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    avec un TIdHTTP, un speedbutton, TImage
    tu peut choisir une cam de l'internet pour tester : http://ip-24.net/main_index.php?lang=fr
    ici j'ai choisi: http://webcam.aui.ma/axis-cgi/mjpg/video.cgi?160204799



    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,  ExtCtrls, ComCtrls, ToolWin,
      Buttons,  IdBaseComponent, IdComponent,
      IdTCPConnection, IdTCPClient, IdHTTP, jpeg;
     
    type
     
      TForm1 = class(TForm)
        IdHTTP1: TIdHTTP;
        SpeedButton1: TSpeedButton;
        SpeedButton2: TSpeedButton;
        Image1: TImage;
        procedure IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
          AWorkCountMax: Int64);
        procedure SpeedButton1Click(Sender: TObject);
        procedure IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
          AWorkCount: Int64);
        procedure SpeedButton2Click(Sender: TObject);
        procedure IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
      private
        { Déclarations privées }
        Inwork:Boolean;
        strem:TMemoryStream;
      public
        { Déclarations publiques }
      end;
    var
       Form1: TForm1;
    implementation
     
    uses Registry,ShellApi;
     
    {$R *.dfm}
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
         sleep(1);
    	 if assigned(strem) then strem.free;
    end;
     
    procedure TForm1.IdHTTP1Work(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCount: Int64);
    var
       Temp:array[0..$FFFF] of byte;
       i,j,n:integer;
       s:AnsiString;
       m,mm:array[1..$100] of byte;
       Jpeg: TJpegImage;
       z:byte;
    begin
     
         j:=strem.Size;
       {     --myboundary
           Content-Type: image/jpeg
           Content-Length: 30754
         }
         strem.Position:=0;
     
         n:=strem.Read(Temp[0],j);
     
           strem.Position:=0;
           s:='Length:';
           i:=1;
           if n>0 then
             repeat
             //  strem.WriteBuffer(z,1);
               while (i<j) and (temp[i]<>ord('L')) do inc(i);
               if (i<j) then
                 begin
                   CopyMemory(@m[1],@temp[i],7);
     
                   if CompareMem(@s[1],@m[1],7) then
                     begin
                       i:=i+7;
                       inc(i);n:=i;
                       while (i<j) and (temp[i]<>13) do inc(i);
                       if i<j then
                         begin
                           setlength(s,i-n);
                           CopyMemory(@s[1],@temp[n],i-n);
     
                             try
                               n:=strtoint(s);
                             except
                               n:=0
                             end;
                         //  ShowMessage(s);
                         end;
                      Panel1.Caption:=inttostr(n);
                      Application.ProcessMessages;
     
                       if n>28000 then
                         begin
                           inc(i,4);
                           strem.Position:=i;
     
                           Jpeg := TJpegImage.Create;
                            try
                              Jpeg.LoadFromStream(strem);
                            //copie de l'image du jpeg dans un bitmap
                              Image1.Picture.Assign(Jpeg);
                              strem.Clear;
                            finally
                              Jpeg.Free;
                            end;
                         end;
     
                       break;
                     end;
                 end;
               inc(i);
               Application.ProcessMessages;
             until (i>=j);
      //   Inwork:=false;
         if not Inwork then IdHTTP1.IOHandler.CloseGracefully;
     
    end;
     
    procedure TForm1.IdHTTP1WorkBegin(ASender: TObject; AWorkMode: TWorkMode;
      AWorkCountMax: Int64);
    begin
          Inwork:=True;
    end;
     
    procedure TForm1.IdHTTP1WorkEnd(ASender: TObject; AWorkMode: TWorkMode);
    begin
     
         Panel7.Caption:=inttostr(strem.Size);
         strem.Position:=0;
     
    end;
     
    procedure TForm1.SpeedButton1Click(Sender: TObject);
    begin
         Inwork:=False;
    end;
     
    procedure TForm1.SpeedButton2Click(Sender: TObject);
    begin
           strem:=TMemoryStream.Create;                 //       http://216.62.222.100/view/index.shtml
           IdHTTP1.Get('http://webcam.aui.ma/axis-cgi/mjpg/video.cgi?833511636',strem);
    end;
    end.
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ edam,

    merci pour cette approche, j'ai testé et j'ai bien une partie de l'image de la caméra avec ton lien, le bas de l'image cela à l'air comme des trames.

    En compilant j'obtiens l'erreur sur cette ligne et particulièrement sur " if not Inwork then IdHTTP1.IOHandler.CloseGracefully;" identificateur non déclaré :

    J'ai donc isolé cette ligne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if not Inwork then IdHTTP1.IOHandler.CloseGracefully;
    En testant, à un moment donné, j'obtiens aussi l'erreur jpeg 28 et 58

    Mais pour voir ma caméra c'est autre chose, pourtant avec un simple fichier html on la voit.

    Je ne met peut être pas le code à sa bonne place ?

    @+,

    cincap

  11. #11
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    non c'est un vieux code, il faut l'otimiser et modfier un peut les propriété de IDHTTP, selon la version de indy
    bon dev
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Citation Envoyé par cincap Voir le message
    J'ai constaté que le Sdk de Dahua relaté par ShaiLeTroll est le même que Golbong fournisseur de mes caméras H264, la seule différence que les fichiers *.exe fonctionnent avec la source Golbong,
    et non avec la source Dahua, je pense que c'est bien du C++ !
    le fichier interessant c'est NetSdk.h c'est lui qui décrit les APIs,
    la ClientDemo c'est des exemples d'utilisation des APIs

    Par exemple, H264_DVR_Init, en dahua c'est CLIENT_Init
    Voici la couche la plus basse que j'ai écrite pour encapsuler les API Dahua : DVRDahuaTechnologyWrapperSLT.rar

    la classe qui t'intéresse c'est TSLiTeDVRDahuaTechnologyClientDirectView mais cela implique d'ouvrir une session sur le DVR puis d'ouvrir le canal correspond à la caméra

    J'ai poussé très loin l'utilisation avec a la fois de la détection de mouvement, du triggering physique sur contact en courant faible, du triggering sur évènement logiciel avec tampon pré/post trigger, ainsi qu'une détection que le DVR fonctionne correctement pour signaler sur l'écran de supervision des éventuelles défaillances (DVR communication coupé, une caméra éteinte ou débit trop faible ...) tout cela évidemment en même temps !

    Par exemple, un contact de porte signale une intrusion, cet event remontait à la Supervision qui déclenchait la récupération de la video sur les caméras liés à ce event sur ce point de détection
    Et en simultané, tu pouvais avoir sur le même DVR, une autre caméra qui fonctionne en détection de mouvement ce qui notifie la Supervision ...
    Ensuite, il était possible de relire un fichier (j'ai bricolé une syntaxe fichier Windows \\server\dossier ou c:\dossier en une syntaxe des fichiers virtuels "*:\DVR-X_CAM-X\..." permettant de trouver le DVR par son ID dans la Supervision et le numéro de la caméra
    soit directement sur le DVR (risqué car une fois le disque plein, cela purgeait les vieux fichiers)
    soit une copie local en format DAV ou converti en AVI H264 qui Windows Media Player pouvait lire avec les plugins installés (à partir de la v11 c'était même par défaut, ce n'était pas le cas pour mon Win XP ^_^)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 423
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 423
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonjour à toutes et à tous,

    @ ShaiLeTroll, merci pour cette source que je vais examiner avec soin.

    Pour mon topic, il avait pour but de réaliser une petite application personnelle en Delphi sinon j'ai bien le logiciel de chez Golbong parfait pour mes deux caméras 2MP H264.

    En ce qui concerne mon topic, je ne sais pas marquer résolut mais je laisse tomber cette question.

    Si quelqu'un veut essayer le logiciel complet de chez Golbong voici le lien :

    https://www.amazon.com/clouddrive/sh...ink_copy_flash

    Merci à tous,

    cincap

Discussions similaires

  1. [MySQL] redirection d'un membre suivant son niveau
    Par dreamover dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 16/03/2009, 16h46
  2. Retouner la valeur d'un objet suivant son nom
    Par Revan dans le forum Langage
    Réponses: 6
    Dernier message: 09/11/2008, 17h19
  3. gestion d'un utilisateur suivant son role
    Par aileen dans le forum Langage
    Réponses: 2
    Dernier message: 14/04/2008, 12h43
  4. Réponses: 8
    Dernier message: 29/06/2006, 14h54
  5. Lire fichier suivant son extension !!
    Par Shandler dans le forum Langage
    Réponses: 37
    Dernier message: 18/11/2005, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo