0

我对从我的网络摄像头录制视频的多线程方法有疑问。我正在使用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 的行。

PS 我对 C# 编码非常陌生,并尝试过 'lock' ,但我无法正确实现。

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

4

1 回答 1

0

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

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

代替

writer.AddFrame(image);

希望能帮助到你。

于 2017-01-18T23:48:53.493 回答