c# - 通过套接字发送视频帧

标签 c# sockets

我使用 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 秒更新一次的帧。当客户端启动时,调用Socket Receive方法,它接收帧并在转换为位图后将其分配给Image WPF控件。我的问题是此操作在客户端中发生且循环未重复。

最佳答案

我认为您做得对,尽管根据您的需要,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);
    }
}

您正在向您的客户端发送一张位图,然后跳出循环。 套接字不会保持打开状态,因此您的客户端会运行一次循环。

关于c# - 通过套接字发送视频帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11845372/

相关文章:

c# - 仅为特定路由或 Controller 需要 SSL 客户端证书

c++ - 如何区分客户端是从服务器端使用 TCP 还是 UDP

java - 套接字中的问题

java - InputStream 没有收到 EOF

java - 丢失的套接字消息

c# - 使用C#/C++,是否可以限制网络流量?

c# - 如何在 *config 文件中保存键的值

c# - 在 C# asp.net 中将字符串中的特定文本设为粗体

c# - if 语句出错 - 无法将类型隐式转换为 'bool'

c++ - socket接收到大数据后recv()返回0