2013-08-03 2 views
0

Donc, mon objectif est de faire une base de l'application de streaming vidéo bare bones. Pour cela, je capture continuellement des images par webcam et je les envoie par le biais de la classe NetworkStream (je sais que c'est une solution brute, mais comme je l'ai dit, il s'agit d'une application basique pour les environnements de production).Image.FromStream est coincé

Alors maintenant, le problème est dans cette ligne

Image img = Image.FromStream(receiveStream); 

Maintenant, ce qui bloque le fil de son ne se déplace pas sur de cette ligne. Il est supposé capturer des images du flux alors qu'est-ce qui ne va pas ici?

Répondre

3

Je suppose que le problème est que le NetworkStream ne se ferme pas, donc Image.FromStream ne sait pas quand l'image actuelle est terminée.

En supposant que vous êtes en charge du protocole, vous pourriez longueur préfixe chaque image, lorsque vous êtes lecture du flux, vous pouvez lire ce nombre exact d'octets dans un tableau d'octets, WRAP avec MemoryStream, puis passez à Image.FromStream. De cette façon, chaque appel à Image.FromStream obtient un flux qui se termine après une seule image.

Ainsi, votre NetworkStream ressemblerait à ceci:

Length (4 bytes) 
Data for one image 
Length (4 bytes) 
Data for one image 
// etc 
+0

Oh je ne savais pas que 'Image.FromStream' nécessite' NetworkStream' pour fermer chaque image. J'envoie environ 20 images par seconde à travers le flux et j'ai juste supposé que 'Image.FromStream' trouverait automatiquement chaque image du flux. Je vais maintenant essayer de contourner cela, merci. –

+0

@WinCoder: Ce n'est qu'un soupçon - mais cela aurait un certain sens. –

3

Vous n'avez pas eu l'occasion de le problème encore réel. La méthode Image.FromStream() nécessite un flux dont la propriété CanSeek est true. Le décodeur d'image l'exige. Ce n'est cependant pas le cas pour un NetworkStream, il ne peut pas supporter la recherche.

Vous devez devez d'abord stocker l'image dans un MemoryStream. Une fois que cela est rempli, remettez la position à 0 et appelez Image.FromStream(). Assurez-vous que ne pas éliminer ou réutiliser le MemoryStream, ce qui provoque un très difficile de diagnostiquer GenericException plus tard. Le décodeur d'image est paresseux et doit pouvoir accéder au flux lorsque l'image est rendue. Pour que cela fonctionne, vous devez connaître le volume de données à lire à partir de NetworkStream. En d'autres termes, vous devez savoir combien d'octets sont présents dans un cadre. Vous pouvez le faire en ayant d'abord l'émetteur int, puis les octets dans l'image. À la fin de la lecture, vous pouvez ensuite lire les 4 octets du flux et utiliser BitConverter.ToInt32() pour récupérer la longueur. Et peut simplement compter les octets dans le flux pour savoir quand le MemoryStream est prêt et Image.FromStream() peut être appelé. Une fois que vous l'aurez mis en place, vous aurez résolu le problème qui affecte votre code actuel ou vous aurez un très bon moyen de le déboguer.