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 컨트롤로 전송합니다. 내 문제는이 동작이 발생하고 반복되지 않는 클라이언트의 루프입니다.
서버에서 이미지를 보내면 소켓이 범위를 벗어나서 클라이언트가 연결을 잃어 버리고 죽는다고 상상해보십시오. – Chris
오류가 발생하지 않았으므로 한 번 호출되는 메서드를 수신합니까? 비디오를 보내는 또 다른 방법이 있습니까? –