如何使用C#Desktop Application在MPEG或AVI文件中记录WebCamvideo

我正在开发一个桌面应用程序,它要求我连接到网络摄像头并以MPEG,AVI,MP4和WMV格式录制(保存)video并刻录到CD / DVD中。 该应用程序是在Win Forms中。 我只是在寻找免费或开源解决方案或控件。

我使用Aforge.Net完成了AVI的保存,但是需要更多的尺寸来保存(例如15sce 320x240video的60-100MB)。 我期待10秒的1MB。 这是代码:

using System; using System.Drawing; using System.Windows.Forms; using AForge.Video; using AForge.Video.DirectShow; using AForge.Video.VFW; namespace Aforge_Web_Cam { public partial class VideoForm : Form { private FilterInfoCollection VideoCaptureDevices; private VideoCaptureDevice FinalVideo = null; private VideoCaptureDeviceForm captureDevice; private Bitmap video; private AVIWriter AVIwriter = new AVIWriter(); private SaveFileDialog saveAvi; public VideoForm() { InitializeComponent(); } private void VideoForm_Load(object sender, EventArgs e) { VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); captureDevice = new VideoCaptureDeviceForm(); } private void butStart_Click(object sender, EventArgs e) { if (captureDevice.ShowDialog(this) == DialogResult.OK) { VideoCaptureDevice videoSource = captureDevice.VideoDevice; FinalVideo = captureDevice.VideoDevice; FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame); FinalVideo.Start(); } } void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs) { if (butStop.Text == "Stop Record") { video = (Bitmap)eventArgs.Frame.Clone(); pbVideo.Image = (Bitmap)eventArgs.Frame.Clone(); AVIwriter.Quality = 0; AVIwriter.AddFrame(video); } else { video = (Bitmap)eventArgs.Frame.Clone(); pbVideo.Image = (Bitmap)eventArgs.Frame.Clone(); } } private void butRecord_Click(object sender, EventArgs e) { saveAvi = new SaveFileDialog(); saveAvi.Filter = "Avi Files (*.avi)|*.avi"; if (saveAvi.ShowDialog() == System.Windows.Forms.DialogResult.OK) { int h = captureDevice.VideoDevice.VideoResolution.FrameSize.Height; int w = captureDevice.VideoDevice.VideoResolution.FrameSize.Width; AVIwriter.Open(saveAvi.FileName, w, h); butStop.Text = "Stop Record"; //FinalVideo = captureDevice.VideoDevice; //FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame); //FinalVideo.Start(); } } private void butStop_Click(object sender, EventArgs e) { if (butStop.Text == "Stop Record") { butStop.Text = "Stop"; if (FinalVideo == null) { return; } if (FinalVideo.IsRunning) { //this.FinalVideo.Stop(); this.AVIwriter.Close(); pbVideo.Image = null; } } else { this.FinalVideo.Stop(); this.AVIwriter.Close(); pbVideo.Image = null; } } private void butCapture_Click(object sender, EventArgs e) { pbVideo.Image.Save("IMG" + DateTime.Now.ToString("hhmmss") + ".jpg"); } private void butCancel_Click(object sender, EventArgs e) { this.Close(); } private void VideoForm_FormClosing(object sender, FormClosingEventArgs e) { if (FinalVideo == null) { return; } if (FinalVideo.IsRunning) { this.FinalVideo.Stop(); this.AVIwriter.Close(); } } } } 

AVIWriter不提供video压缩,请使用AForge.Video.FFMPEG中的FileWriter。 在那里你可以选择一切:大小,帧速率,编解码器和比特率,如果你的video在20秒内是600MB,那么现在它将在20秒内达到6 MB。

干得好:

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using AForge.Video; using AForge.Video.DirectShow; using AForge.Video.FFMPEG; using AForge.Video.VFW; namespace WindowsFormsApplication12 { public partial class Form1 : Form { private FilterInfoCollection VideoCaptureDevices; private VideoCaptureDevice FinalVideo = null; private VideoCaptureDeviceForm captureDevice; private Bitmap video; //private AVIWriter AVIwriter = new AVIWriter(); private VideoFileWriter FileWriter = new VideoFileWriter(); private SaveFileDialog saveAvi; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); captureDevice = new VideoCaptureDeviceForm(); } private void button1_Click(object sender, EventArgs e) { if (captureDevice.ShowDialog(this) == DialogResult.OK) { VideoCaptureDevice videoSource = captureDevice.VideoDevice; FinalVideo = captureDevice.VideoDevice; FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame); FinalVideo.Start(); } } void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs) { if (butStop.Text == "Stop Record") { video = (Bitmap)eventArgs.Frame.Clone(); pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone(); //AVIwriter.Quality = 0; FileWriter.WriteVideoFrame(video); //AVIwriter.AddFrame(video); } else { video = (Bitmap)eventArgs.Frame.Clone(); pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone(); } } private void button2_Click(object sender, EventArgs e) { saveAvi = new SaveFileDialog(); saveAvi.Filter = "Avi Files (*.avi)|*.avi"; if (saveAvi.ShowDialog() == System.Windows.Forms.DialogResult.OK) { int h = captureDevice.VideoDevice.VideoResolution.FrameSize.Height; int w = captureDevice.VideoDevice.VideoResolution.FrameSize.Width; FileWriter.Open(saveAvi.FileName, w, h,25,VideoCodec.Default,5000000); FileWriter.WriteVideoFrame(video); //AVIwriter.Open(saveAvi.FileName, w, h); butStop.Text = "Stop Record"; //FinalVideo = captureDevice.VideoDevice; //FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame); //FinalVideo.Start(); } } private void butStop_Click(object sender, EventArgs e) { if (butStop.Text == "Stop Record") { butStop.Text = "Stop"; if (FinalVideo == null) { return; } if (FinalVideo.IsRunning) { //this.FinalVideo.Stop(); FileWriter.Close(); //this.AVIwriter.Close(); pictureBox1.Image = null; } } else { this.FinalVideo.Stop(); FileWriter.Close(); //this.AVIwriter.Close(); pictureBox1.Image = null; } } private void button3_Click(object sender, EventArgs e) { pictureBox1.Image.Save("IMG" + DateTime.Now.ToString("hhmmss") + ".jpg"); } private void button4_Click(object sender, EventArgs e) { this.Close(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (FinalVideo == null) { return; } if (FinalVideo.IsRunning) { this.FinalVideo.Stop(); FileWriter.Close(); //this.AVIwriter.Close(); } } } }