PDA

View Full Version : [C#.Net] Cl/Sr Invio immagini cam lente e non fluide


Honik
18-08-2010, 22:12
Salve a tutti..
ho questo programmino Client/Server e uso UDP per l'invio di immagini.. la cattura da cam la effettuo con aforge.. metto i frame in una coda ed invio!! Vi faccio vedere il codice Server

for (; ; )
{
if (coda.Count > 0)
{
try
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
byte[] data;
img = coda.Dequeue();
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Position = 0;
data = new byte[stream.Length];
stream.Read(data, 0, Convert.ToInt32(stream.Length));
stream.Close();
IPEndPoint ep = new IPEndPoint(broadcast, port);
s.SendTo(data, ep);

} }
catch (Exception e)
{
}
}
}

lato client invece

listener = new UdpClient(port);
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, port);
try
{
while (true)
{
byte[] b = listener.Receive(ref groupEP);
MemoryStream mstream = new MemoryStream(b);
Bitmap bmm = new Bitmap(mstream);
bmm = new Bitmap(bmm, new Size(320, 240));
pictureBox1.Image = bmm;
}
}
catch (Exception e)
{
}
finally
{
listener.Close();
}

non sono per niente esperto del campo.. mi son servito degli esempi trovati in rete e su msdn!

Perchè vedo le immagini non fluide? alcune a scatti.. altre volte si blocca e mi arrivano tutte d'un colpo.. dove sbaglio?
grazie

nikel
29-08-2010, 19:23
scusa per la risposta tardiva.. ma causa vacanze non sono sul forum da un pò..

io innanzitutto farei attendere il server prima di inviare l'immagine al clienti fino a quando questo non ha visualizzato quella precedente (ad esempio puoi far inviare al client qualche byte che significa "sono pronto a riceverne una nuova")

poi... potresti usare jpeg invece di png... e inviare soltanto i pixel differenti dall'immagine precedente per ridurre il numero di byte da inviare...

a questo proposito dai un occhio qui
http://www.bryancook.net/2009/10/find-differences-between-images-c.html

spero di esserti stato d'aiuto ;)

----
siccome è uno stream potrebbe aiutare creare un buffer e mantenerlo non solo a lato server ma anche a lato client.. se il client "può restare indietro di qualche frame";