none
Probleme envoie image dans stream RRS feed

  • Discussion générale

  • Bonjour,

    Je souhaiterais créer un programme qui me permet de rendre ma webcam accessible depuis les connections TCP (webcam live)

    Pour cela j'envoie image par image (et non en vidéo) et depuis ces derniers temps, je me heurte à un problème concernant l'envoi d'image via un stream.

    Je m'explique, le client envoie une image préalablement convertie en tableau de bytes (Dim Data as Byte()), ce qui me fait un tableau d'à peu près 16000 bytes (16Mo), l'envoi se passe très bien, mais lors de la réception, le serveur ignore complètement les 1024 premiers bytes. passé le cap du 1025ème byte, la réception se passe très bien.

    Je me suis rendu compte de plus que durant mes test (Débug pas à pas avec espion sur variables sur serveur et client en simultané), ce problème ne se présente pas à tous les coups, C'EST DU PUR RANDOM !

    Voici le bout de code qui permet d'envoyer et recevoir les images:

    '---------- ENVOI DE L'IMAGE -------------------
    'PROGRAMME CLIENT
    
    Dim ms As New IO.MemoryStream
    Dim img as image = Me.Camera.getCurrentFrame 'Fonction qui me retourne une image capturé depuis ma webcam
    Dim Buffer As Byte()
    
    img.save(ms, Imaging.ImageFormat.Jpeg)
    Buffer = ms.GetBuffer
    
    Me.Stream.Write(Buffer, 0, Buffer.Length) 'Me.Stream.Write est équivalent à TcpClient.getStream.write
    
    '---------- RECEPTION DE L'IMAGE -------------------
    'PROGRAMME SERVER
    
    Dim buffer As Byte() = New Byte(20000) {}
    Me.Stream.Read(buffer, 0, buffer.Length)
    
    Dim ms As New IO.MemoryStream(buffer)
    img = Image.FromStream(ms)

    j'ai tenté d'augmenter la taille de mémoire tampon mais sans succès:

    Dim BufferedStream As New BufferedStream(Me.Stream, 20000)
    BufferedStream.Read(buffer, 0, buffer.Length)

    Je ne sais pas du tout ou est le soucis, surtout que le fonction de temps en temps. Si quelqu'un a une petite idée, je suis preneur.

    Merci d'avance

    jeudi 23 novembre 2017 00:12

Toutes les réponses

  • Bonjour,
    Les threads suivants peuvent vous donner une idée:
    how to deliver video-streaming from image stream in c#
    Si vous avez besoin de convertir le code en visual basic, voici un converteur.
    Faites attention à la méthode Stream.CopyTo dans la première solution fournie ici: Creating a byte array from a stream.

    Cordialement,
    Nina

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

    jeudi 23 novembre 2017 14:45
    Modérateur
  • Merci j'ai pu plancher sur les liens que vous m'avez donné, j'ai pu enfin arriver à ce que je voulais faire à l’exception d'une chose.

    Je bloque sur la réception du stream, les images en 1280*1080 sont trop grandes pour être envoyés en une seule fois donc je les lis par "paquets", c'est un peu l'exemple donné sur cette page :

    https://msdn.microsoft.com/fr-fr/library/system.io.stream.read%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

    j'ai essayé de suivre le code de l'exemple (voir code en bas du message) en l'adaptant à mon code mais je bloque:

    -- Soit dans la boucle sur la ligne "n = s.Read(bytes, numBytesRead, 10)" (comme s'il attendait une suite au stream alors qu'il n'y a plus rien à lire)

         par exemple: pour une image de 25482 octets, il le 25482ème octet et attend

    -- Soit je reste indéfiniment dans la boucle jusqu'a avoir une valeur de "n" en négatif (ce qui m'envoie une belle petite erreur)

         par exemple: pour le même fichier de 25482 octets, il continue la lecture sur le 25483, 25484 ... (alors qu'il n'y a plus rien a lire)

    D'un essai à un autre, le résultat n'est jamais le même (avec les mêmes images transférés)

    Imports System
    Imports System.IO
    
    Public Class Block
        Public Shared Sub Main()
            Dim s As Stream = New MemoryStream()
            For i As Integer = 0 To 121
                s.WriteByte(CType(i, Byte))
            Next i
            s.Position = 0
    
            ' Now read s into a byte buffer that is padded slightly.
            Dim bytes(s.Length + 10) As Byte
            Dim numBytesToRead As Integer = s.Length
            Dim numBytesRead As Integer = 0
            Dim n As Integer
            Do
                ' Read may return anything from 0 to 10.
                n = s.Read(bytes, numBytesRead, 10)
                ' The end of the file is reached.
                numBytesRead += n
                numBytesToRead -= n
            Loop While numBytesToRead > 0
    
            s.Close()
    
            Console.WriteLine("number of bytes read: {0:d}", numBytesRead)
        End Sub
    End Class

    je sèche un peu sur ce problème, quelqu'un aurait une idée?

    lundi 27 novembre 2017 20:52