Extrahieren von „einem von 10 Bildern“ in einem Video mit VLC oder FFmpeg

12

Ich versuche, "genau 1 Bild von 10" Bildern eines Videos (dh 1 extrahieren, 9 lassen, dann wiederholen) für wissenschaftliche Zwecke zu extrahieren. Das Video ist 105 Bilder, 3,5 Sekunden, 29,97 fps (h.264, .mov, produziert von Nikon D3100).

Ich habe es hier hochgeladen .

VLC

Der folgende Befehl sollte 10 Bilder erzeugen, aber nur 6 Bilder. Ich habe verschiedene Szenenverhältnisse ausprobiert und keines von beiden erzeugt die richtige Anzahl von Bildern (nicht einmal annähernd korrekt).

vlc 1.mov --video-filter=scene --vout=dummy --scene-ratio=10 --scene-prefix=img- --scene-path=. vlc://quit

Würde mir bitte jemand sagen, wo das Problem liegt?

FFmpeg

FFmpeg scheint keinen Befehl genau für meinen Zweck zu haben. Der folgende Befehl extrahiert 3 Frames aus jeder Sekunde, aber da der FPS nicht genau 30 (eher 2,97) beträgt, führt dies für mich nicht zu korrekten Ergebnissen.

Außerdem gibt selbst FFmpeg mit diesem Befehl nicht die richtige Anzahl von Frames aus. Für 3,5 Sekunden Video erwarte ich höchstens 10 Bilder, aber ich bekomme 12 Bilder!

ffmpeg -i 1.mov -y -an -sameq  -r 3 -f image2 -vcodec mjpeg %03d.jpg 

Wie kann ich erreichen, was ich will?

wmac
quelle
1
BTW -sameqmacht nicht das, was Sie wahrscheinlich denken, und wurde aus der aktuellen Version entfernt (das echte ffmpeg, das heißt, ich bin nicht sicher, ob es im gefälschten Ubuntu-ffmpeg ist). Verwenden Sie stattdessen qscale.
Stib

Antworten:

21

Wählen Sie 1 Bild von 10 Bildern aus

Sie können den selectVideofilter verwenden ffmpeg, um dies zu tun:

ffmpeg -i input.mov -vf "select=not(mod(n\,10))" -vsync vfr -q:v 2 img_%03d.jpg
  • Für die JPG-Ausgabe können Sie die Qualität mit variieren -q:v. Der effektive Bereich liegt zwischen 2 (beste Qualität) und 31 (schlechteste Qualität). Sie benötigen diese Option nicht, wenn Sie stattdessen in PNG ausgeben möchten.

  • Dies wird ausgegeben img_001.jpg, img_002.jpg, img_003.jpgusw.

llogan
quelle
Sieht sehr interessant aus, scheint aber eine bestimmte Version oder etwas extra Kompiliertes zu erfordern. Ich erhalte " unrecognized option '-filter:v'" mit "FFmpeg Version SVN-r0.5.1-4: 0.5.1-1ubuntu1.3" (--enable-avfilter --enable-avfilter-lavf --enable-vdpau --enable-bzlib --enable -libgsm --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-libvorbis --enable-pthreads --enable-zlib --disable-stripping --disable-vhook --enable-runtime-cpudetect - -enable-gpl --enable-postproc --enable-swscale --enable-x11grab --enable-libdc1394 --enable-shared --disable-static)
mivk
Ich kann den Befehl auch nicht ausführen und unter ffmpeg Windows N-35709-g7d531e8 den folgenden Fehler erhalten: [select @ 017EBB00] [Eval @ 0022DC08] Missing ')' oder zu viele Argumente in 'mod (n \, 10))' [ select @ 017EBB00] Fehler beim Parsen des Ausdrucks 'not (mod (n \, 10))' Fehler beim Initialisieren des Filters 'select' mit args 'not (mod (n \, 10))' Fehler beim Öffnen der Filter!
Wmac
@mivk Ihre FFmpeg-Version aus dem Ubuntu-Repo verfügt nicht über Filterfunktionen. Sie müssen FFmpeg kompilieren .
Llogan
1
@wmac Ich denke, Windows mag die einfachen Anführungszeichen nicht. Ändern Sie sie in doppelte Anführungszeichen : ".
Llogan
1
@ LordNeckbeard, danke, es läuft korrekt und hat das ganze Problem gelöst. Ich bin sehr dankbar für Ihre Hilfe.
Wmac
4

Der wichtigste Aspekt in Ihrer Frage ist die Tatsache, dass das Video 29,97 Bilder pro Sekunde verwendet, nicht 30. Pesky NTSC.

Wie auch immer, ich denke, es wäre am einfachsten, einfach jeden Frame zu extrahieren und dann diejenigen zu entfernen, die Sie nicht benötigen:

ffmpeg -i 1.mov -y -f image2 -c:v mjpeg %03d.jpg

Entfernen Sie dann diejenigen, die Sie nicht benötigen. Da jeder zehnte Frame mit einem endet 1.jpg, können wir einfach alle anderen nehmen ...

find . -maxdepth 1 -not -iname "*1.jpg"

… Und wenn Sie sicher sind, dass Sie diese entfernen möchten:

find . -maxdepth 1 -not -iname "*1.jpg" -exec rm '{}' \;

Wenn Sie verwenden können mencoder, können Sie die in der Dokumentationframestep erläuterte Option wie in Ihrem Fall ausprobieren . Ich persönlich konnte es allerdings nicht installieren / ausprobieren.framestep=10

slhck
quelle
1
Vielen Dank für Ihre Hilfe und Ihre Bearbeitung. Ich habe Mencoder ausprobiert und selbst dieser hat ein Problem! Ich denke, es hat etwas mit Codec oder Container zu tun. ffmpeg extrahiert genau 105 Frames mit dem folgenden Befehl: ffmpeg -i 1.mov -y -an -sameq -f image2 -vcodec mjpeg% 03d.jpg, aber der Mencoder extrahiert nur 90 Frames !!! mit folgendem Befehl: mplayer -vo png 1.mov Die Verwendung von framestep = 10 erzeugt auch eine falsche Anzahl von Frames. Ich bin schockiert darüber, dass alle drei (ffmpeg, vlc und mencoder) eine so einfache Aufgabe nicht richtig ausführen können. Ich habe einen Fehlerbericht an die VLC-Website gesendet. Danke noch einmal.
Wmac
0

Wenn Sie das Video zuerst in eine Reihe von rgb24- oder rgb32-Rohbildern konvertieren würden, könnten Sie möglicherweise die richtige Anzahl von Bildern erhalten, da es in der Originalform ungewöhnliche Bildtypen zu geben scheint, die möglicherweise überhaupt keine Bilder sind? ?

Bei den Original-Laserdiscs bestand das gesamte Video aus einer Reihe von Bildern mit einzelnen Bildnummern von 1 bis 100.000 oder mehr. Auf diese Weise können Sie wirklich eine Basis für zukünftige Konvertierungen oder Manipulationen festlegen.

Die Branche hat auf diese seltsame Komprimierungsidee umgestellt, um lediglich die ausgegebenen Gelder zu reduzieren und echte wissenschaftliche Formen des Umgangs mit Zahlen zu korrumpieren.

Sie müssen zuerst Audio als Wave-Datei extrahieren, um Audio nicht vollständig zu verlieren. Es scheint, dass FFMPEG identifizierende Informationen in jedes extrahierte Bild einfügt, denn wenn Sie versuchen, Bilder aus den gerade extrahierten zusammenzufügen und andere Bilder aus anderen Quellen mit derselben Erweiterung zu mischen, ignoriert ffmpeg die Bilder, die Sie versucht haben, in die Mitte von allem zu setzen .

Beim Laserdisc-Format wird die Bildrate einfach durch die Rate bestimmt, mit der Sie die aufeinander folgenden Bilder präsentieren, und wird in keiner Weise von den Bildern selbst gesteuert.

FFMPEG könnte eine Lehre aus der Wissenschaft anstelle der Kunst ziehen, um Bilder jeglicher Art richtig zu handhaben und anzuzeigen. Oder möglicherweise die gesamte AV-Branche selbst. Die Industrie muss die Fähigkeiten der Hardware wirklich verbessern und Rohdaten verwenden, die viel Speicher benötigen. Nichts geht über Rohdaten für Präzision und Genauigkeit.

Aluetta
quelle