Um genau zu arbeiten, konvertieren Sie das Video zuerst in einen RAW YUV-Bitstream (sofern dies nicht bereits geschehen ist).
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Nächster Schritt: Der select
Filter nimmt einen Ausdruck , wobei n
die Bildnummer ist.
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="mod(n-1\,2)" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -r 2 -s WxH -i rawbitstream.yuv -filter:v select="not(mod(n-1\,2))" \
-c:v rawvideo -r 1 -format rawvideo -pix_fmt yuv420p -an even.yuv
Um ffmpeg
Frames nicht zu duplizieren, müssen Sie die Hälfte der Framerate Ihrer Eingabe erzwingen - also setzen Sie "2" als Eingabe und "1" als Ausgabe. Vergessen Sie nicht, das WxH durch die tatsächlichen Abmessungen Ihres Clips zu ersetzen, da der unformatierte Bitstream keinen Header hat, der diese Informationen enthält.
Stattdessen besteht eine andere Möglichkeit darin, den setpts
Filter hinzuzufügen , um neue Zeitstempel für die Ausgabe festzulegen. Aber sei vorsichtig, da es Frames nicht genau fallen lässt. Hier ist 25 die tatsächliche gewünschte Ausgangsbildrate:
ffmpeg -i input.mp4 -filter:v select="mod(n-1\,2)",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an odd.yuv
ffmpeg -i input.mp4 -filter:v select="not(mod(n-1\,2))",setpts="N/(25*TB)" \
-c:v rawvideo -r 12.5 -format rawvideo -pix_fmt yuv420p -an even.yuv
Sie können natürlich ein anderes (beliebiges ffmpeg -pix_fmts
) Pixelformat auswählen . Stellen Sie sicher, dass Sie beim Lesen der Datei die Pixelgröße und das Pixelformat kennen:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …
-vf
ist ein Alias von-filter:v
. Ich kann es jetzt nicht zuverlässig testen, werde es aber später untersuchen, wenn ich wieder auf meinem Computer bin. Vielleicht kann dertinterlace
Filter das auch?Wenn Ihr ffmpeg mit der AviSynth-Flagge erstellt wurde, können Sie meiner Meinung nach eine
.avs
Datei übergeben.Sie können dies überprüfen, indem Sie die Konfigurationsdaten ausführen
ffmpeg
und suchen .--enable-avisynth
Wenn es dort können Sie es gerne nutzen so:
ffmpeg -i blahEven.avs blahEven.yuv
.Wo
blahEven.avs
ist einfach:Verwenden Sie für ungerade Bilder
SelectOdd()
.Weitere Informationen zur Verwendung finden Sie in der SelectEvery- Dokumentation.
quelle
--enable-avisynth
da wäre, würde das bedeuten, dass AviSynth in ffmpeg eingebaut ist, aber da bin ich mir nicht sicher.