2013-08-30 51 views
0

我需要一些幫助將筆記本電腦相機中的視頻保存到文件中。現在我使用代碼搜索視頻設備和pictureBox上的以前的視頻。 我試過用AVIFileWrite,但我失敗了。 如何使用VideoFileWriter實現我的目標?c#AForge.NET - 如何將視頻從相機保存到文件中

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using AForge.Video; 
using AForge.Video.DirectShow; 
using AForge.Video.FFMPEG; 
using System.IO; 
using AForge.Video.VFW; 
using System.Drawing.Imaging; 

namespace VideoCapture 
{ 
    public partial class Form1 : Form 
    { 
     private FilterInfoCollection VideoCaptureDevices; 
     private VideoCaptureDevice FinalVideo; 
     public static Bitmap _latestFrame; 
     //private VideoFileWriter writer; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      VideoCaptureDevices = new     FilterInfoCollection(FilterCategory.VideoInputDevice); 
     foreach (FilterInfo VideoCaptureDevice in VideoCaptureDevices) 
     { 
      comboBox1.Items.Add(VideoCaptureDevice.Name); 
     } 
     comboBox1.SelectedIndex = 0; 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

     FinalVideo = new VideoCaptureDevice(VideoCaptureDevices[comboBox1.SelectedIndex].MonikerString); 
     FinalVideo.NewFrame += new NewFrameEventHandler(FinalVideo_NewFrame); 
     FinalVideo.Start(); 
    } 
    void FinalVideo_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 
     Bitmap video = (Bitmap)eventArgs.Frame.Clone(); 

     pictureBox1.Image = video; 

     //int width = 640; 
     //int height = 480; 

     //VideoFileWriter writer = new VideoFileWriter(); 
     //writer.Open(@"c:\video.avi", width, height, 25, VideoCodec.Default, 1000000); 

     //for (int i = 0; i < 1000; i++) 
     //{ 
     // writer.WriteVideoFrame(video); 
     //} 

     //writer.Close(); 

     //Bitmap image = new Bitmap(width, height, PixelFormat.Format24bppRgb); 
     //writer.WriteVideoFrame(image);      
     //MessageBox.Show("jest");   
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (FinalVideo.IsRunning) 
     { 
      FinalVideo.Stop(); 

     } 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if (FinalVideo.IsRunning == true) FinalVideo.Stop(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     label1.Text = "Device running..." + FinalVideo.FramesReceived.ToString() + " FPS"; 
    } 

} 

}

回答

0

這不是一個明確的答案,但是:每次你打電話writer.Open(...),它使用的不是Win32.OpenFileMode.ReadWrite Win32.OpenFileMode.Create,所以它會每次覆蓋文件而不是添加幀,所以你的結果將是一個包含1幀的視頻。我有同樣的問題:my page

+0

由於IP攝像機沒有一個穩定的幀率和作家有沒有動態的FPS,你可以更好地使用VLC。 –

1
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(); 
      } 
     } 


    } 
} 

以這種方式;)

+0

我正在使用您的代碼。有用!!但我有這個問題:如果我使用筆記本電腦集成攝像頭沒有問題。如果我選擇一個外部USB攝像頭,圖像是黑色的。你有什麼想法嗎? – Daniele

相關問題