Obtenir une image à partir de la vidéo
Je suis en train d'écrire une application qui peuvent accéder à des caméras connectées à un PC, l'enregistrement d'une vidéo et d'obtenir une image de la vidéo. J'utilise AForge.NET les bibliothèques pour accéder aux caméras: http://www.aforgenet.com/framework/
Je ne sais pas comment l'événement nommé AForge.Vidéo.NewFrameEventHandler œuvres. Dans ce code, l'événement renvoie la valeur null à une image au lieu d'une nouvelle image à partir d'une vidéo ou l'événement n'est pas appelé. Je veux obtenir des images de la vidéo à une zone de l'image à chaque fois que cadre pour faire quelque chose comme un flux vidéo et après cliquez sur le bouton stop, je veux la dernière image pour rester affichée dans la zone d'image. Personne ne sait comment? Et pourquoi mon code ne fonctionne pas?
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
}
}
}
Le même code est ici: http://www.aforgenet.com/framework/features/directshow_video.html[^]
Dans les Windows Forms-je utiliser cette vidéo dans un thread qui n'cette méthode:
private void VideoRecording()
{
camImg.videoSource.Start();
while (!StopVideo)
{
pictureBox1.Image = camImg.bitmap;
pictureBox1.Invalidate();
}
camImg.videoSource.Stop();
}
source d'informationauteur Pepin z Hané
Vous devez vous connecter pour publier un commentaire.
Si je me souviens bien le bitmap doit être immédiatement copiées depuis qu'il est écrasé après l'événement. À l'aide d'une référence n'est pas bon ici. Essayez quelque chose comme:
ou
Aussi, vous ne devez pas utiliser un fil supplémentaire pour cela, AForge déjà fait.
Gérer le cadre des événements
private void VideoStream_NewFrame(object sender, AForge.Vidéo.NewFrameEventArgs eventArgs)
{
Bitmap newFrame = new Bitmap(eventArgs.Image);
pictureBox1.Image = newFrame;
}
Appel Stop (événement de clôture ou d'un bouton)
Si vous rencontrez des problèmes avec WinForm contrôles par exemple, une étiquette que vous devez savoir que ces contrôles ont été créés sur un autre thread et vous avez besoin d'utiliser Invoquer. E. g:
Votre meilleur pari est de vérifier cette AForge de l'échantillon qui vient avec le cadre:
http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/
Je suis en utilisant le Aforge vidéo de la bibliothèque avec mon Foscams, et il fonctionne très bien.
Voici mon code pour le gestionnaire d'événement.
Un chemin à parcourir est de obtenir ou écrire un wrapper autour de FFMPEGqui peut faire le travail pour vous de extraire des images à partir de votre vidéo. J'ai travaillé sur deux projets qui ont utilisé ce moyen d'obtenir des vignettes et/ou d'images fixes à partir de vidéos mises en ligne. Il va se sentir un peu hackish, mais il devrait fonctionner.