Scusate.. in effetti all'inizio volevo un parere sul "metodo" aldilą del codice.. comunque vi posto il codice, che per me č anzi molto meglio
Ho AForge.NET che mi inizializza la webcam e mi da, sotto forma di evento, ogni frame catturato..(Webcam.videosource.NewFrame)
eppoi la classe che manda il tutto che č questa
Nell'invio vero e proprio aspetto il messaggio "sendframe".. se ce l'ho posso inviare il frame e allora prima mando un mess "sendsize" informando l'altra macchina che sto per inviare la grandezza.. poi invio la grandezza (cosģ che l'altra macchina preparare un byte[] di quella grandezza).. aspetto l'altra conferma ed invio!!
Codice PHP:
public partial class Form1 : Form
{
//Numero incaricati al trasporto
Queue<Bitmap>[] queueFrames = new Queue<Bitmap>[3];
Thread[] thread = new Thread[3];
TcpClient[] client = new TcpClient[3];
public Form1()
{
InitializeComponent();
inizializzaCode();
}
private void inizializzaCode()
{
for (int i = 0; i < 3; i++)
queueFrames[i] = new Queue<Bitmap>();
}
private void button1_Click(object sender, EventArgs e)
{
Webcam.getDevices();
Webcam.startFrame(0);
Webcam.videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);
for (int i = 0; i < 3; i++)
{
thread[i] = new Thread(new ParameterizedThreadStart(sendFrame));
thread[i].Start(new object[] { queueFrames[i], client[i] });
}
}
int indexcoda = 0;
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
//inserisco sequenzialmente in ogni coda diversa i frame catturati
if (indexcoda == 2)
{
queueFrames[indexcoda].Enqueue((Bitmap)eventArgs.Frame.Clone());
indexcoda = 0;
}
else
{
queueFrames[indexcoda].Enqueue((Bitmap)eventArgs.Frame.Clone());
indexcoda += 1;
}
}
private void sendFrame(Object obj)
{
object[] objs = (object[])obj;
Queue<Bitmap> queue = (Queue<Bitmap>)objs[0];
TcpClient client = (TcpClient)objs[1];
//Connessione e stream
IPHostEntry addr = Dns.GetHostEntry("indirizzomio");
StringBuilder sb1 = new StringBuilder();
client = new TcpClient(addr.AddressList[0].ToString(), 9999);
NetworkStream stream = client.GetStream();
StreamWriter sWriter = new StreamWriter(stream);
StreamReader sReader = new StreamReader(stream);
/////////////////////
//Gestione compressione JPEG
ImageCodecInfo jgpEncoder = GetEncoder(ImageFormat.Jpeg);
System.Drawing.Imaging.Encoder myEncoder = System.Drawing.Imaging.Encoder.Quality;
EncoderParameters myEncoderParameters = new EncoderParameters(1);
EncoderParameter myEncoderParameter = new EncoderParameter(myEncoder, 50L);
myEncoderParameters.Param[0] = myEncoderParameter;
////////////////////////////
//Ciclo invio frames
byte[] data;
while (true)
{
try
{
if (queue.Count > 0)
{
sb1.Append(sReader.ReadLine());
if (sb1.ToString().Contains("sendframe"))
{
if (client.Connected)
{
//connesso
StringBuilder s2 = new StringBuilder();
MemoryStream mStream = new MemoryStream();
queue.Dequeue().Save(mStream, jgpEncoder, myEncoderParameters);
mStream.Position = 0;
data = new byte[mStream.Length];
mStream.Read(data, 0, Convert.ToInt32(mStream.Length));
mStream.Close();
s2.Append(data.Length);
sWriter.WriteLine("sendsize");
sWriter.Flush();
sWriter.WriteLine(s2);
sWriter.Flush();
if (sReader.ReadLine().Contains("oksend"))
{
stream.Write(data, 0, data.Length);
}
mStream.Close();
}
else
{
//non connesso
break;
}
}
}
}
catch (Exception ex)
{
}
}
////////////////////
}
private ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
}