C# 多线程视频录制源



我对从网络摄像头录制视频的多线程方法有疑问。我正在使用AForge框架。

代码运行良好,如果在单个线程上,视频也会保存。但是,在录制过程中,流会冻结。我认为使用不同的线程进行录音应该可以解决问题。

我有这个功能,可以录制大约 4 秒的剪辑:

void startrecord()
    {
        writer.Codec = "wmv3";
        writer.FrameRate = 30;
        writer.Open("C://temp//test.avi", pictureBox1.Image.Width, pictureBox1.Image.Height);
        // create frame image
        Bitmap image = new Bitmap(pictureBox1.Image.Width, pictureBox1.Image.Height);
        for (int i = 0; i < 240; i++)
        {
            image = (Bitmap)pictureBox1.Image;
            //Add Date Time Stamp
            RectangleF rectf = new RectangleF(10, 10, 140, 17);
            Graphics g = Graphics.FromImage(image);              //00
            g.FillRectangle(Brushes.Black, rectf);
            g.DrawString(DateTime.Now.ToString("dd:MM:yyyy HH:mm:ss"), new Font("Tahoma", 10), Brushes.Red, rectf);
            g.Flush();
            writer.AddFrame(image);
        }
        writer.Close();
    }

上述函数由按钮单击事件调用:

private void button2_Click(object sender, EventArgs e)
    {
        //1: Thread t2 = new Thread(startrecord);
        //2: t2.Start();
        startrecord();   //3
    }

现在,当我尝试运行第 1 行和第 2 行时,出现错误

对象当前正在其他地方使用。

JIT 指向标记为//00 的行。

附言我对 C# 编码非常陌生,并尝试了"锁定",但我无法正确实现它。

任何帮助将不胜感激。谢谢!

GDI+ 对象不是线程安全的。我建议尝试这样的事情:

writer.AddFrame((Bitmap)image.Clone());

而不是

writer.AddFrame(image);

希望对您有所帮助。

最新更新