2012-08-07 49 views
5

Tôi đã chụp luồng video bằng thiết bị Kinect. Tôi cần Gửi luồng này qua mạng. Vì mục đích này, tôi đã sử dụng ổ cắm. cô là đoạn mã trong máy chủ và máy khách:Gửi khung hình video qua ổ cắm

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

Chủ đầu tư:

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 là khung readed từ Kinect và mỗi 1 giây cập nhật. Khi Client khởi động, hãy gọi phương thức Socket Receive, nó nhận frame và sau khi chuyển đổi sang bitmap asign nó thành Image WPF control. Vấn đề của tôi là hành động này xảy ra và vòng lặp trong máy khách không lặp lại.

+0

Chỉ cần đoán, nhưng một khi bạn gửi hình ảnh trong máy chủ, Ổ cắm của bạn nằm ngoài phạm vi để tôi tưởng tượng khách hàng mất kết nối và chết. – Chris

+0

Không có bất kỳ lỗi nào xảy ra, tại sao lại nhận được phương thức gọi là một lần? Có cách nào khác để gửi video không? –

Trả lời

2

Tôi nghĩ bạn đang làm đúng, mặc dù tùy thuộc vào nhu cầu của bạn Ổ cắm UDP có thể có ý nghĩa hơn. Hãy thử thay đổi mã máy chủ của bạn để một cái gì đó như thế này:

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

Bạn đã gửi một bitmap để khách hàng của bạn, sau đó rơi ra khỏi vòng lặp. Ổ cắm sẽ không mở để khách hàng của bạn chạy vòng lặp của nó một lần.

+0

Cảm ơn, nó đã hoạt động. Nếu gửi bitmap trong vòng lặp máy chủ không thành công, làm thế nào để kết nối lại trong máy khách đến máy chủ? –

Các vấn đề liên quan