2017-06-08 8 views
0

Mit folgendem Code zeichne und speichere ich Videos von der Webcam auf die Festplatte. Aber selbst ein 3-Sekunden-Video speichert mit einer Dateigröße von etwa 50 MB. Ich nehme an, ich missbrauche die VideoWriter-Klasse. Irgendwelche Vorschläge?EmguCV VideoWriter erstellt riesige Speicherdateien?

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Emgu.CV; 
using Emgu.CV.Structure; 

namespace EmguCV_Webcam 
{ 
    public partial class Form1 : Form 
    { 

     #region Private variables 

     private Capture currentDevice; 
     private VideoWriter videoWriter; 
     private bool recording; 
     private int videoWidth; 
     private int videoHeight; 

     #endregion 

     #region Constructors 

     public Form1() 
     { 
      InitializeComponent(); 
      InitializeVariables(); 
      AttachButtonMacros(); 
      StartVideoFeed(); 
     } 


     #endregion 

     #region Methods 

     private void InitializeVariables() 
     { 
      currentDevice = new Capture(0); 
      recording = false; 
      videoWidth = currentDevice.Width; 
      videoHeight = currentDevice.Height;    
     } 

     private void StartVideoFeed() 
     { 
      currentDevice.Start(); 
      currentDevice.ImageGrabbed += CurrentDevice_ImageGrabbed; 
     } 

     private void AttachButtonMacros() 
     { 
      StartRecordingButton.Click += StartRecordingButton_Click; 
      StopRecordingButton.Click += StopRecordingButton_Click; 
     } 

     private void CurrentDevice_ImageGrabbed(object sender, EventArgs e) 
     { 
      Mat m = new Mat(); 
      currentDevice.Retrieve(m); 
      VideoPictureBox.Image = m.ToImage<Bgr, byte>().Bitmap; 
      if (recording && videoWriter != null) 
      { 
       videoWriter.Write(m); 
      } 
     } 

     private void StartRecordingButton_Click(object sender, EventArgs e) 
     { 
      recording = true; 
      SaveFileDialog dialog = new SaveFileDialog(); 
      dialog.DefaultExt = ".avi"; 
      dialog.AddExtension = true; 
      dialog.FileName = DateTime.Now.ToString(); 
      DialogResult dialogResult = dialog.ShowDialog(); 
      if(dialogResult != DialogResult.OK) 
      { 
       return; 
      } 
      videoWriter = new VideoWriter(dialog.FileName, 30, new Size(videoWidth, videoHeight), true); 
     } 

     private void StopRecordingButton_Click(object sender, EventArgs e) 
     { 
      recording = false; 
      if(videoWriter != null) 
      { 
       videoWriter.Dispose(); 
      }   
     } 

     #endregion 

    } 
} 
+0

Klingt wie Sie unkomprimiertes Video gerade schreiben. Sie müssen einen Codec auswählen, um diese Größe zu verringern. Ist das auf Linux oder Windows? Der Grund, warum ich frage ist, weil der [Docs] (http://www.emgu.com/wiki/files/3.0.0/document/html/8e6a89b8-b00d-2674-2fe0-22a62fd8f48d.htm), dass der Konstruktor Sie sollten in Ihrem Code "unter Windows einen Codec-Auswahldialog öffnen" aber unter Linux "den Standard-Codec verwenden". Haben Sie stattdessen [diesen Konstruktor] (http://www.emgu.com/wiki/files/3.0.0/document/html/0b658427-7e09-1cc0-53cf-be1a40f98140.htm) versucht? – spender

+0

Danke, habe das gerade versucht, aber es verursacht jetzt noch mehr Probleme. Zunächst stürzt es das Programm ab, wenn ich Visual Studio für x86 nicht konfiguriere. Wenn ich den Konstruktor verwende, der den Benutzer auffordert, einen Codec auszuwählen, bekomme ich folgende Auswahl: Cinepak Codec nach Radius, Logitech Video (I420), Intel IYUV Codec, Microsoft RLE, Microsoft Video 1 und Full Frames (unkomprimiert). Einige, einschließlich der ersten, verursachen einen Fehler: – Alex

+0

System.AccessViolationException aufgetreten HResult = 0x80004003 Nachricht = versucht, geschützten Speicher zu lesen oder zu schreiben. Dies ist oft ein Hinweis darauf, dass anderer Speicher beschädigt ist. Source = Emgu.CV.World Stacktrace: bei Emgu.CV.CvInvoke.cveVideoWriterWrite (IntPtr Schriftsteller, IntPtr Bild) bei Emgu.CV.VideoWriter.Write (Mat Rahmen) bei EmguCV_Webcam.Form1.CurrentDevice_ImageGrabbed (Object sender , EventArgs e) in c: \ Benutzer \ Yoga 710 \ Dokumente \ Visual Studio 2017 \ Projekte \ EmguCV_Webcam \ EmguCV_Webcam \ Form1.cs: Zeile 70 bei Emgu.CV.Capture.Grab() bei Emgu.CV.Capture. Run() – Alex

Antwort

0

Sie sollten die Komprimierung verwenden. Try this

VideoWriter.Fourcc('M', 'P', '4', 'V') 

ändern So

videoWriter = new VideoWriter(dialog.FileName, 30, new Size(videoWidth, videoHeight), true); 

mit

videoWriter = new VideoWriter(dialog.FileName, VideoWriter.Fourcc('M', 'P', '4', 'V'), 30, new Size(videoWidth, videoHeight), true);