2012-10-22 14 views
10

Ich versuche eine Anwendung zu schreiben, die auf Kameras zugreifen kann, die mit dem PC verbunden sind, ein Video aufzeichnen und ein Bild von dem Video bekommen. Ich verwende AForge.NET-Bibliotheken für den Zugriff auf Kameras: http://www.aforgenet.com/framework/Get Image from Video

Ich weiß nicht, wie das Ereignis namens AForge.Video.NewFrameEventHandler funktioniert. In diesem Code gibt das Ereignis null zu einer Bitmap statt eines neuen Rahmens aus einem Video zurück, oder das Ereignis wird nicht aufgerufen. Ich möchte jedes Mal Frames aus dem Video in ein Bildfeld ziehen, um so etwas wie einen Videostream zu erstellen, und nach dem Klicken auf den Stopp-Button möchte ich, dass das letzte Bild im Bildfenster angezeigt wird. Weiß jemand wie? Und warum funktioniert mein Code nicht?

Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using AForge.Video.DirectShow; 
using System.Drawing; 
using AForge.Video; 

namespace CameraDevice 
{ 
    public class CameraImaging 
    { 
     // enumerate video devices 
     public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); 
     //camera 
     public VideoCaptureDevice videoSource; 
     //screen shot 
     public Bitmap bitmap; 
     public CameraImaging() 
     { 
      // create video source 
      VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString); 
      // set NewFrame event handler 
      videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); 
     } 
     public void StartVideo(VideoCaptureDevice videoSource) 
     { 
      // start the video source 
      videoSource.Start(); 
      // ... 
     } 
     public void StopVideo(VideoCaptureDevice videoSource) 
     { 
      // stop the video source 
      videoSource.Stop(); 
      // ... 
     } 
     private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
     { 
      // get new frame 
      bitmap = eventArgs.Frame; 
      // process the frame 
     } 
    } 
} 

Der ähnliche Code ist hier: http://www.aforgenet.com/framework/features/directshow_video.html[ ^]

In dem Windows Forms ich dieses Video in einem Thread ausgeführt, die diese Methode funktioniert:

private void VideoRecording() 
    { 
     camImg.videoSource.Start(); 

     while (!StopVideo) 
     { 
      pictureBox1.Image = camImg.bitmap; 
      pictureBox1.Invalidate(); 
     } 
     camImg.videoSource.Stop(); 

    } 
+0

AForge.NET verwendet systemeigene DirectShow-API für den Zugriff auf Video Capture-Hardware.Möglicherweise möchten Sie stattdessen die [DirectShow.NET] (http://directshownet.sourceforge.net/) -Bibliothek aufrufen, die die am häufigsten verwendete "Brücke" zwischen .NET-Anwendungen und Video-Capture-APIs darstellt. –

Antwort

3

Wenn ich mich richtig erinnere, muss die Bitmap sofort kopiert werden, da sie nach dem Ereignis überschrieben wird. Eine Referenz zu verwenden, ist hier nicht gut. Versuchen Sie so etwas wie:

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    // copy the new frame 
    bitmap = new Bitmap(eventArgs.Frame); 
    // process the frame 
} 

oder

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    // clone new frame 
    bitmap = eventArgs.Frame.Clone(); 
    // process the frame 
} 

Auch sollten Sie nicht ein extra Thread für diese, tut AForge bereits.

  1. Anruf starten (zB im Load-Ereignis oder nach Drücken einer Taste)
  2. den Rahmenveranstaltungen Griff

    private void VideoStream_NewFrame (object sender, EventArgs AForge.Video.NewFrameEventArgs) { Bitmap newFrame = neues Bitmap (eventArgs.Frame); pictureBox1.Image = neuer Rahmen; }

  3. Anruf Stop (Abschlussveranstaltung oder Taste)

Wenn Sie auf Probleme stoßen mit WinForm beispielsweise steuert Sie müssen wissen, dass diese Steuerelemente in einem anderen Thread erstellt wurden und Sie Invoke verwenden müssen. Z. B:

label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString())); 

Ihre beste Wette ist diese AForge Probe, das mit dem Rahmen kommt zu überprüfen: http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/

1

ich die Video-Bibliothek Aforge mit meinem Foscams benutzen und es sehr gut funktioniert. Hier ist mein Code für den Event-Handler.

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) 
    { 
     //Create Bitmap from frame 
     Bitmap FrameData = new Bitmap(eventArgs.Frame); 
     //Add to PictureBox 
     PictureBox.Image = FrameData; 
    }