Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#视频流太慢了_C#_Sockets_Tcp_Tcpclient - Fatal编程技术网

c#视频流太慢了

c#视频流太慢了,c#,sockets,tcp,tcpclient,C#,Sockets,Tcp,Tcpclient,我是c#新手,我为流式视频编写代码,我不知道这是否正确 听众 namespace WindowsFormsApplication6 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private Socket sk; private NetworkStream ns; pri

我是c#新手,我为流式视频编写代码,我不知道这是否正确

听众

namespace WindowsFormsApplication6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    private Socket sk;
    private NetworkStream ns;
    private TcpListener tlp;
    private Thread th;

    void res()
    {
        try
        {
            tlp = new TcpListener(2100);
            tlp.Start();
            sk = tlp.AcceptSocket();
            ns = new NetworkStream(sk);
            pictureBox1.Image = Image.FromStream(ns);
            tlp.Stop();
            if (sk.Connected == true)
            {
                while (true)
                {
                    res();
                }
            }

        }catch(Exception ex){}

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        th = new Thread(new ThreadStart(res));
        th.Start();

    }
}
}
客户呢

   namespace WindowsFormsApplication5
       {
      public partial class Form1 : Form
       {
     public Form1()
      {
        InitializeComponent();
      }
    private FilterInfoCollection capture;
    private VideoCaptureDevice frame;
    private NetworkStream ns;
    private TcpClient tlp;
    private MemoryStream ms;
    private BinaryWriter br;

    private void Form1_Load(object sender, EventArgs e)
    {
        capture = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        foreach(FilterInfo de in capture){

            com.Items.Add(de.Name);
        }
        //com.SelectedIndex = 0;



    }

    private void st_Click(object sender, EventArgs e)
    {
        frame = new VideoCaptureDevice(capture[com.SelectedIndex].MonikerString);
        frame.NewFrame += frame_NewFrame;
        frame.Start();
    }

    void frame_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        try
        {
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
            ms = new MemoryStream();
            pictureBox1.Image.Save(ms, ImageFormat.Bmp);
            byte[] buffer = ms.GetBuffer();
            ms.Close();
            tlp = new TcpClient("192.168.0.104", 2100);
            ns = tlp.GetStream();
            br = new BinaryWriter(ns);
            br.Write(buffer);
            tlp.Close();
            ms.Close();
            ns.Close();
            br.Close();
        }
        catch (Exception ex) { MessageBox.Show(ex.Message); };
    }
}
 }
我在同一网络上的两台计算机上进行测试 它显示来自另一台计算机的图像,但速度太慢
我的代码中的问题是什么

您在客户机中以线程的形式执行所有操作,而应该在后台异步缓冲数据,并且只在主线程上播放数据。您还可以通过多种其他方式来完成所需的操作,其中之一是在表单中嵌入Windows Media Player控件,以播放WMP支持的任何可流式格式


如果您只想流式处理数据,那么在客户机的NewFrame处理程序中,您应该做的唯一一件事就是将数据缓冲在缓冲区中,可能是一个
队列
或任何数据格式。您应该跟踪主线程上缓冲了多少帧,并在缓冲区中至少有2-3帧(如果是视频,则为5-10秒)后启动显示。显示例程将从缓冲区中删除.Dequeue()数据,直到数据为空。然后再次等待缓冲更多的数据。请注意,您需要使用锁对象来防止读写线程之间的冲突,或者只需使用.NET 4.0中引入的新并发集合之一,如
ConcurrentQueue
(在System.collections.concurrent中)。()

您可以在客户端和服务器上添加秒表日志记录,以帮助您更好地了解计时。打开/关闭每个帧的TCP连接会增加大量开销。另外,您放弃内存缓冲区,而不是对每一帧重复使用相同的缓冲区。@alexm那么,如果我打开tcp并仅在关闭程序时关闭它,速度会很快吗?@JamieMeyer谢谢,我将尝试添加它