2011-10-18 3 views
1

Je suis complètement nouveau à l'entrée vidéo, et j'ai commencé à travailler avec AForge il y a quelques jours. Travailler avec la vidéo en direct est confortable, mais je dois faire quelque chose avec des fichiers pour un projet maintenant. En utilisant le codec VCM Windows Media Video 9, l'enregistrement n'a pas posé de problème. Le fichier de sortie fonctionne normalement avec tous les lecteurs que j'ai, mais mon programme le lit toujours à environ deux fois la fréquence d'images. Ceci est particulièrement étrange car il n'y a jamais aucune indication que la fréquence d'images est changée: à la fois la vidéo par défaut a été enregistrée avec et le nouveau lecteur indique que la fréquence d'images est de 25 fps.Diminuer le framerate d'un fichier AVI dans AForge

Les seules suggestions que j'ai trouvées sont de changer la fréquence d'image avant que la vidéo soit capturée, mais cela semble ne rien faire.

En parcourant la documentation de AVIFileVideoSource, j'ai trouvé les propriétés FrameIntervalFromSource et FrameInterval qui, ensemble, devraient me donner les résultats que je recherche, mais je ne peux pas les faire fonctionner non plus. Tout le reste a été une impasse et je n'ai plus d'idées. Voici le code que j'utilise pour lire le fichier:

public partial class Form1 : Form 
{ 
    AVIReader input = new AVIReader(); 
    AVIFileVideoSource source = new AVIFileVideoSource("test.avi"); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void cam_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 
     input.Open("test.avi"); 
     for (int i = 0; i < input.Length; i++) 
     { 
      pictureBox1.Image = input.GetNextFrame(); 
     } 
     source.Stop(); 
     input.Close(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     source.NewFrame += new NewFrameEventHandler(cam_NewFrame); 
     source.Start(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     source.Stop(); 
     input.Close(); 

    } 
} 

Toutes les autres suggestions seraient grandement appréciées. Merci pour votre temps.

Répondre

1

J'ai trouvé une solution de travail au problème en examinant d'autres zones de la bibliothèque. Dans cette solution, il y avait deux autres classes que je visais: DirectShow, qui était déjà référencé, et Control. Plus précisément, je devais utiliser des instances de FileVideoSource et VideoSourcePlayer pour obtenir la vidéo dans quelque chose que je pourrais travailler avec.

Cette version est différente de ce qui précède en ce que les fonctions de lecture et d'écriture ont été combinées en un seul programme. De plus, j'étais plutôt pressé de le faire, donc c'est assez fragile. Néanmoins, voici ma solution:

public partial class Form1 : Form 
{ 
    public Bitmap newBitmap; 
    public VideoCaptureDevice cam = null; 
    public FilterInfoCollection usbCams; 

    AVIReader reader = new AVIReader(); 
    AVIWriter writer = new AVIWriter("wmv3"); 
    AVIFileVideoSource source = new AVIFileVideoSource("test.avi"); 

    FileVideoSource normSource = new FileVideoSource("test.avi"); 
    VideoSourcePlayer player = new VideoSourcePlayer(); 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public void cam_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 
     Bitmap image = (Bitmap)eventArgs.Frame.Clone(); 
     writer.AddFrame(image); 

     pictureBox1.Image = image; 
    } 

    public void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 
     newBitmap = (Bitmap)eventArgs.Frame.Clone(); 
     pictureBox1.Image = newBitmap; 
    } 

    private void videoSourcePlayer_NewFrame(object sender, ref Bitmap image) 
    { 
     videoSourcePlayer1.VideoSource = normSource; 
     videoSourcePlayer1.GetCurrentVideoFrame(); 

     videoSourcePlayer1.DrawToBitmap(newBitmap, 
      new Rectangle(0, 0, image.Width, image.Height)); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     source.NewFrame += new NewFrameEventHandler(video_NewFrame); 
     source.Start(); 
     videoSourcePlayer1.NewFrame += new AForge.Controls.VideoSourcePlayer.NewFrameHandler(videoSourcePlayer_NewFrame); 
     videoSourcePlayer1.Start(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     if (source.IsRunning == true) 
     { 
      source.Stop(); 
      videoSourcePlayer1.Stop(); 
     } 

     if (cam != null) 
     { 
      cam.Stop(); 
      writer.Close(); 
     } 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     usbCams = new FilterInfoCollection(FilterCategory.VideoInputDevice); 
     cam = new VideoCaptureDevice(usbCams[0].MonikerString); 
     cam.DesiredFrameSize = new Size(320, 240); 

     writer.Open("test.avi", 320, 240); 

     cam.NewFrame += new NewFrameEventHandler(cam_NewFrame); 
     cam.DesiredFrameRate = 25; 
     cam.Start(); 
    } 
} 

Merci d'avoir lu.