Я использую UDP для потоковой передачи видео, но я должен разделить на основной массив сегментов и отправить несколько пакетов, потому что размер кадра больше, чем размер udp max. Это нормально, но это udp, поэтому массивы часто поступают не в том порядке, в котором они были на стороне клиента (что-то вроде этого: первый сегмент первого кадра, третий сегмент второго кадра и т. Д.). Я могу группировать сегменты, но часто сегменты, полученные в неправильных кадрах (первый сегмент первого кадра, второй сегмент второго кадра, третий сегмент второго кадра). Отправить:UDP-поток видео C#
while(true){
int c = CvInvoke.cvWaitKey(33);
if (c == 27)
break;
Byte[] byteData1 = rgb32Image.Bytes;
Byte[] byte1 = new Byte[65000];
Byte[] byte2 = new Byte[65000];
Byte[] byte3 = new Byte[65000];
Byte[] byte4 = new Byte[65000];
byte1[0] = 1;
byte2[0] = 2;
byte3[0] = 3;
byte4[0] = 4;
System.Buffer.BlockCopy(byteData1, 0, byte1, 1, 64999);
obj.socket.Send(byte1, byte1.Length);
System.Buffer.BlockCopy(byteData1, 64999, byte2, 1, 64999);
obj.socket.Send(byte2, byte2.Length);
System.Buffer.BlockCopy(byteData1, 64999 * 2, byte3, 1, 64999);
obj.socket.Send(byte3, byte3.Length);
System.Buffer.BlockCopy(byteData1, 64999 * 3, byte4, 1, byteData1.Length - (3 * 64999);
obj.socket.Send(byte4, byte4.Length);
}
Прием:
VideoReceive(IAsyncResult ar)
{
StateObject stateobj = (StateObject)ar.AsyncState;
UdpClient client = stateobj.workSocket;
IPEndPoint senderIPEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] byte1 = client.EndReceive(ar, ref senderIPEndPoint);
Byte[] byte2 = client.Receive(ref senderIPEndPoint);
Byte[] byte3 = client.Receive(ref senderIPEndPoint);
Byte[] byte4 = client.Receive(ref senderIPEndPoint);
switch (byte1[0])
{
case 1:
System.Buffer.BlockCopy(byte1, 1, buffer, 0, 64999);
break;
case 2:
System.Buffer.BlockCopy(byte1, 1, buffer, 64999, 64999);
break;
case 3:
System.Buffer.BlockCopy(byte1, 1, buffer, 64999 * 2, 64999);
break;
case 4:
System.Buffer.BlockCopy(byte1, 1, buffer, 64999 * 3, 64999);
break;
}
switch (byte2[0])
{
case 1:
System.Buffer.BlockCopy(byte2, 1, buffer, 0, 64999);
break;
case 2:
System.Buffer.BlockCopy(byte2, 1, buffer, 64999, 64999);
break;
case 3:
System.Buffer.BlockCopy(byte2, 1, buffer, 64999 * 2, 64999);
break;
case 4:
System.Buffer.BlockCopy(byte2, 1, buffer, 64999 * 3, 64999);
break;
}
switch (byte3[0])
{
case 1:
System.Buffer.BlockCopy(byte3, 1, buffer, 0, 64999);
break;
case 2:
System.Buffer.BlockCopy(byte3, 1, buffer, 64999, 64999);
break;
case 3:
System.Buffer.BlockCopy(byte3, 1, buffer, 64999 * 2, 64999);
break;
case 4:
System.Buffer.BlockCopy(byte3, 1, buffer, 64999 * 3, 64999);
break;
}
switch (byte4[0])
{
case 1:
System.Buffer.BlockCopy(byte4, 1, buffer, 0, 64999);
break;
case 2:
System.Buffer.BlockCopy(byte4, 1, buffer, 64999, 64999);
break;
case 3:
System.Buffer.BlockCopy(byte4, 1, buffer, 64999 * 2, 64999);
break;
case 4:
System.Buffer.BlockCopy(byte4, 1, buffer, 64999 * 3, 64999);
break;
}
stateobj.workSocket.BeginReceive(new System.AsyncCallback(VideoReceive), stateobj);
mask2.Bytes = buffer;
pictureBox1.BeginInvoke(new MethodInvoker(() => { pictureBox1.Image = mask2.ToBitmap(); }));
}
Итак, как я могу передавать видео через UDP сокетов (без какой-либо дополнительной библиотеки)? P.S. Вы можете ответить по коду или алгоритму.
Номера последовательностей и много буферизации. потоковое видео! = тривиальное. –
@MartinJames, поэтому я спросил, как это сделать –