2015-02-12 11 views
5

Mit AForge ffmpeg wrapper können Sie Frames aus einem Video mithilfe der VideoFileReader-Klasse extrahieren und als Bitmap speichern.C# Extrahieren von Frames aus einem Teil einer Videodatei

Sehen Sie dies für die exemple: Extracting frames of a .avi file

mit, dass mein Problem ist, dass Sie nicht angegeben, wo der Rahmen Lesen zu beginnen. Es beginnt immer am Anfang der Videodatei.

Aber was, wenn ich Bilder extrahieren wollte, die mitten in einer zwei Stunden langen Videodatei sind. Mit dieser Klasse müssten Sie die gesamte erste Stunde analysieren, um zu diesen Frames zu gelangen.

Kennt jemand einen Weg, um das zu erreichen?

+0

Scheint, dass sie keine Möglichkeit dafür bieten. Sie könnten versuchen zu schummeln, indem Sie die Datei mit einer anderen Bibliothek ausschneiden oder einfach eine andere Bibliothek verwenden, um zunächst Frames zu extrahieren. EDIT: Sie können die privaten Mitglieder der 'VideoFileReader'-Instanz vollständig debuggen und sehen, ob Reflection Ihnen hier vielleicht helfen kann. – SimpleVar

+0

Sieht nach einer guten Antwort für mich aus, hat es dir nicht gefallen? –

Antwort

4

Wenn Sie wissen, wo im Video Sie mit dem Lesen beginnen möchten, überspringen Sie einfach die entsprechende Anzahl von Bildern. es gibt keine Notwendigkeit, irgendwelche von ihnen zu verarbeiten.

Dies setzt natürlich voraus, dass Sie die genaue Bildnummer kennen, mit der Sie beginnen möchten, die Sie durch Multiplizieren der Bildfrequenz mit der Zeit multiplizieren können, zu der Sie die Extraktion durchführen möchten. In Ihrem Beispiel, wenn das Video zwei Stunden lang, und Sie wollen Frames aus der Mitte extrahieren ...

VideoFileReader reader = new VideoFileReader(); 
reader.Open("file.avi"); 

// Jump to 1 hour into the video 
int framesToSkip = reader.FrameRate * 3600; // 1 hour = 3600 seconds 
for (int i = 0; i < framesToSkip; i++) 
    reader.ReadVideoFrame(); 

// Now the next time ReadVideoFrame() is called, we will get the frame at the 1 hour mark 

Dies setzt voraus, dass die .FrameRate Eigenschaft den Wert in Bildern pro Sekunde liefert. Leider sagt der documentation nicht, so bin ich nicht sicher, wie es Videodateien mit nicht ganzzahligen Frameraten behandelt (d. H. 29,97 ist eine gemeinsame Framerate.)

+0

Dies scheint leider der einzige Weg mit dem AForge/Accord-Wrapper zu sein. Ich würde hinzufügen, wenn Sie diese Methode verwenden, um jedes Bild, das Sie wegwerfen, '' videoFrame.Dispose() '' (innerhalb der Überspringen-Schleife), sonst werden Sie Fehler nach etwa 1k Frames erhalten. –

Verwandte Themen