Frage

Ich bin völlig neu in der Videoeingabe und habe gerade vor ein paar Tagen angefangen, mit AForge zu arbeiten. Die Arbeit mit Live -Video ist komfortabel, aber ich muss jetzt etwas mit Dateien für ein Projekt tun.

Mit dem Windows Media Video 9 VCM Codec war das Speichern kein Problem. Die Ausgabedatei funktioniert normalerweise mit jedem Spieler, den ich habe, aber mein Programm spielt sie immer wieder mit der doppelten Bildrate zurück. Dies ist besonders seltsam, da es nie einen Hinweis darauf gibt, dass die Bildrate geändert wird: Beide Standard, mit der das Video gespeichert wurde, und der neue Player zeigt an, dass die Bildrate 25 fps beträgt.

Die einzigen Vorschläge, die ich gefunden habe, sind die Bildrate, bevor das Video erfasst wird, aber dies scheint nichts zu tun.

Als ich mich in der Dokumentation von AvifilevideOsource umsah, fand ich die Eigenschaften von Framintervalfromsource und FrameInterval, die mir zusammen die Ergebnisse geben sollten, nach denen ich suche, aber ich kann sie auch nicht zum Laufen bringen. Alles andere war eine Sackgasse und ich habe keine Ideen mehr. Hier ist der Code, den ich zum Lesen der Datei verwende:

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

    }
}

Alle anderen Vorschläge wären sehr geschätzt. Vielen Dank für Ihre Zeit.

War es hilfreich?

Lösung

Ich fand eine funktionierende Lösung für das Problem, indem ich in einige andere Bereiche der Bibliothek untersuchte. In dieser Lösung gab es zwei weitere Klassen, die ich übersehen hatte: DirectShow, auf die bereits verwiesen wurde, und die Kontrolle. Insbesondere musste ich Instanzen von FilevideOsource und Videosourceplayer verwenden, um das Video in etwas zu bringen, mit dem ich arbeiten konnte.

Diese Version unterscheidet sich von den oben genannten, als sowohl die Lese- als auch die Schreibfunktionen zu einem Programm kombiniert wurden. Außerdem war ich in einer Art Eile, dies zu erledigen, also ist es immer noch ziemlich zerbrechlich. Trotzdem ist hier meine Lösung:

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

Danke fürs Lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top