2012-08-07 37 views
5

Capture la transmisión de video con el dispositivo Kinect. Necesito enviar esta transmisión a través de la red. Para este propósito utilicé enchufes. Su es una pieza de código en el servidor y el cliente:Enviar video a través del socket

private System.Drawing.Bitmap _CurrentBitmap; 
    public ManWindow() 
    { 
     InitializeComponent(); 

     this.Loaded += delegate 
     { 
      BackgroundWorker bw1 = new BackgroundWorker(); 
      bw1.RunWorkerCompleted += (a, b) => bw1.RunWorkerAsync(); 
      bw1.DoWork += delegate { SendImage(); }; 
      bw1.RunWorkerAsync(); 
     }; 
    } 
    public void SendImage() 
    { 
     Socket sListen = new Socket(AddressFamily.InterNetwork, 
            SocketType.Stream, 
            ProtocolType.Tcp); 

     IPAddress IP = IPAddress.Parse("127.0.0.1"); 
     IPEndPoint IPE = new IPEndPoint(IP, 4321); 

     sListen.Bind(IPE); 
     sListen.Listen(2); 

     while (true) 
     { 
      Socket clientSocket; 
      clientSocket = sListen.Accept(); 

      var converter = new System.Drawing.ImageConverter(); 
      byte[] buffer = (byte[])converter.ConvertTo(_CurrentBitmap, typeof(byte[])); 
      clientSocket.Send(buffer, buffer.Length, SocketFlags.None); 
     } 
    } 

Cliente:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     BackgroundWorker bw11111 = new BackgroundWorker(); 
     bw11111.RunWorkerCompleted += (a, b) => bw11111.RunWorkerAsync(); 
     bw11111.DoWork += delegate { Recive(); }; 
     bw11111.RunWorkerAsync(); 
     Recive(); 
    } 

    public void Recive() 
    { 
     Socket s = new Socket(AddressFamily.InterNetwork, 
          SocketType.Stream, 
          ProtocolType.Tcp); 

     IPAddress IP = IPAddress.Parse("127.0.0.1"); 
     IPEndPoint IPE = new IPEndPoint(IP, 4321); 
     s.Connect(IPE); 

     while (true) 
     { 

      byte[] buffer = new byte[1000000]; 

      s.Receive(buffer, buffer.Length, SocketFlags.None); 

      MemoryStream ms = new MemoryStream(buffer); 

      ms.Write(buffer, 0, buffer.Length); 
      System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(ms); 

      Dispatcher.BeginInvoke(new Action(() => 
      { 
       rgbImage11.Source = bitmap.ToBitmapSource(); 
      })); 

     } 
    } 

_CurrentBitmap es el marco que readed de Kinect y actualizada cada 1 segundo. Cuando el Cliente se inicia, llame al método de recepción de Socket, recibe el marco y luego de convertirlo a un mapa de bits, asócielo al control de Image WPF. Mi problema es que esta acción ocurre unos y el bucle en el cliente no se repite.

+0

Solo supongo, pero una vez que envía la imagen en el servidor, su Socket queda fuera de alcance por lo que imagino que el cliente pierde la conexión y muere. – Chris

+0

No se produce ningún error, ¿por qué recibir el método llamado una vez? ¿Hay alguna otra manera de enviar video? –

Respuesta

2

Creo que lo está haciendo bien, aunque dependiendo de sus necesidades, los sockets UDP podrían tener más sentido. Intente cambiar su código de servidor a algo como esto:

while (true) 
{ 
    Socket clientSocket; 
    clientSocket = sListen.Accept(); 

    var converter = new System.Drawing.ImageConverter(); 
    while(true) // find a better way to determine that the picture is still updating? 
    { 
     byte[] buffer = (byte[])converter.ConvertTo(_CurrentBitmap, typeof(byte[])); 
     clientSocket.Send(buffer, buffer.Length, SocketFlags.None); 
    } 
} 

quiere realizar el envío de un mapa de bits para su cliente, entonces cae fuera del circuito. El socket no permanecerá abierto, por lo que su cliente ejecuta su ciclo una vez.

+0

Gracias, funcionó. Si falla el envío de mapa de bits en el bucle del servidor, ¿cómo volver a conectar el cliente al servidor? –

Cuestiones relacionadas