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 …