2012-08-07 4 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는 키 넥트 업데이트 1 초마다에서 읽혀질 프레임이다. 클라이언트가 시작되면 소켓 수신 방식을 호출하면 프레임을 수신하고 비트 맵으로 변환 한 후 이미지 WPF 컨트롤로 전송합니다. 내 문제는이 동작이 발생하고 반복되지 않는 클라이언트의 루프입니다.

+0

서버에서 이미지를 보내면 소켓이 범위를 벗어나서 클라이언트가 연결을 잃어 버리고 죽는다고 상상해보십시오. – Chris

+0

오류가 발생하지 않았으므로 한 번 호출되는 메서드를 수신합니까? 비디오를 보내는 또 다른 방법이 있습니까? –

답변

2

여러분이 필요로하는 바에 따라 UDP 소켓이 더 적합 할 수도 있지만 제대로하고 있다고 생각합니다. 이런 식으로 서버 코드를 변경해보십시오 : 당신은 다음 루프에서 떨어지는, 클라이언트에 하나의 비트 맵을 전송했다

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

. 소켓이 열려 있지 않으므로 클라이언트가 루프를 한 번 실행합니다.

+0

고마워, 효과가 있었다. 서버 루프에서 비트 맵을 보내지 못하면 클라이언트에서 서버로 다시 연결하는 방법은 무엇입니까? –

관련 문제