2012-08-07 23 views
5

Kinectデバイスでビデオストリームをキャプチャしました。このストリームをネットワーク経由で送信する必要があります。この目的のために私はソケットを使いました。 彼女は、サーバとクライアントのコードの一部です:ソケット経由でビデオフレームを送信

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); 
     } 
    } 

クライアント:

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はKinectをし、更新ごとに1秒からreadedフレームです。クライアントが起動すると、Socket Receiveメソッドを呼び出し、フレームを受信し、ビットマップに変換した後、Image WPFコントロールに渡します。私の問題は、このアクションが繰り返されないクライアントのループとループが発生することです。

+0

サーバでイメージを送信すると、あなたのSocketが範囲外になり、クライアントが接続を失って死んでしまうと想像してしまいます。 – Chris

+0

何もエラーは発生しません。ビデオを送る別の方法はありますか? –

答えて

2

あなたのニーズに応じて、あなたは正しいことをしていると思いますが、UDPソケットはもっと理にかなっています。 このような何かにあなたのサーバーのコードを変更してみてください:あなたは、ループの外に落ちる、あなたのクライアントに1つのビットマップを送信して

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); 
    } 
} 

。 ソケットは開いたままではないので、クライアントはループを1回実行します。

+0

ありがとう、それは働いた。サーバループでビットマップを送信できなかった場合、クライアントとサーバの再接続はどうすればよいですか? –

関連する問題