【发布时间】:2013-11-05 12:43:29
【问题描述】:
我对使用多线程方法从我的网络摄像头录制视频有疑问。我正在使用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# 编码非常陌生,并尝试了 'lock' ,但我无法正确实现。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
好的,只是稍微备份一下..您的网络摄像头界面是否触发任何事件或以其他方式表示它刚刚完成了向 PictureBox 呈现完整帧的信号? Iask,因为那是拍摄图像并将其排队等待在另一个线程中处理/保存的时间。
-
@Martin 是的,确实如此。新的帧事件处理程序是:'FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame);'函数是: void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs) { //Frame Handler Bitmap video = (Bitmap)eventArgs.Frame.Clone();图片框1.图像=视频; }
-
“writer”对象在哪里初始化,我认为它应该在 startRecord 函数本身中初始化。
标签: c# multithreading video-capture aforge