Zrobiłem strumień wideo za pomocą urządzenia Kinect. Muszę wysłać te strumienie przez sieć. W tym celu użyłem gniazd. Her jest kawałek kodu w serwerze i kliencie:Wysyłaj ramkę wideo przez gniazdo
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);
}
}
Klient:
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 jest rama że odczytany z Kinect i co 1 sekundę aktualizowana. Po uruchomieniu klienta wywołaj metodę Socket Receive, otrzyma ramkę i po przekonwertowaniu na bitmapę przypisuje ją do kontrolki Image WPF. Mój problem polega na tym, że akcja ta występuje i pętla w kliencie nie jest powtarzana.
To tylko przypuszczenie, ale gdy wyślesz obraz na serwer, Twój Gniazdo nie mieści się w zasięgu, więc wyobrażam sobie, że klient traci połączenie i umiera. – Chris
Nie pojawia się żaden błąd, dlaczego metoda jest wywoływana raz? Czy istnieje inny sposób przesyłania wideo? –