2012-08-07 20 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 है। जब क्लाइंट शुरू होता है, फोन सॉकेट प्राप्त विधि है, यह फ्रेम प्राप्त करता है और परिवर्तित छवि WPF नियंत्रण करने के लिए इसे asign बिटमैप के बाद। मेरी समस्या यह है कि यह क्रिया क्लाइंट में एक और लूप होती है जिसे दोहराया नहीं जाता है।

+0

बस एक अनुमान, लेकिन एक बार आप सर्वर में छवि भेजने के लिए, अपने सॉकेट क्षेत्र से बाहर तो मैं सोच भी ग्राहक कनेक्शन खो देता है, और मर जाता है गिर जाता है। – Chris

+0

नहीं किसी भी त्रुटि, क्यों विधि एक बार कहा जाता है प्राप्त होता है? क्या वीडियो भेजने का कोई और तरीका है? –

उत्तर

2

मुझे लगता है कि आप इसे सही कर रहे हैं, हालांकि अपनी आवश्यकताओं पर निर्भर करता है यूडीपी सॉकेट अधिक मतलब हो सकता है। कुछ इस तरह करने के लिए अपने सर्वर कोड को बदलने का प्रयास करें:

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

धन्यवाद, यह काम किया। यदि सर्वर लूप में बिटमैप भेजना विफल रहा है, क्लाइंट में सर्वर से पुन: कनेक्ट कैसे करें? –