Вы делаете много ненужных вещей, например, создаете 3 растровых изображения вместо одного, устанавливаете изображение bm на picbox и, конечно, запускаете код для основного пользовательского интерфейса. Конечно, это замерзнет. Для простого и быстрого исправления создайте таймер. Установите интервал 10. Создайте button
, который остановит таймер, и тот, который запустит его и запишет. В таймере вместо звонка
неоднократно
pictureBox1.Image = bm;
использование
pictureBox1.Invalidate();
Код:
//not good names. change it to something meaningfull
private Bitmap bm;
private Graphics g;
VideoFileWriter videowriter;
private void timer1_Tick( object sender, EventArgs e ) {;
//takes the screenshot
g.CopyFromScreen( 0, 0, 0, 0, bm.Size );
videowriter.WriteVideoFrame(bm);
pictureBox1.Invalidate();
}
Кнопка, с которой начинается запись:
private void Start_Click( object sender, EventArgs e ) {
//create both bitmap and graphics once!
bm = new Bitmap( Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height );
g = Graphics.FromImage( bm );
pictureBox1.Image = bm; //Just once!
basePath = sel.ToString();
basePath = @"C:\Users\sim\Videos\Captures";
videowriter = new VideoFileWriter();
videowriter.Open(basePath + "timelapse.avi", Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, 9, VideoCodec.MPEG4, 1200000);
timer1.Enabled = true;
}
Кнопка остановки записи:
private void Stop_Click( object sender, EventArgs e ) {
timer1.Enabled = false;
pictureBox1.Image = null;
bm.Dispose();
bm = null;
g.Dispose();
g = null;
videowriter.Close();
//I don't know if videowriter can be disposed if so dispose it too and set it to null
}
Также установите picturebox
SizeMode в StreachImage