Per funzionare in modo accurato, prima converti il video in bitstream RAW YUV (se non lo è già):
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Passaggio successivo: il select
filtro accetta un'espressione , dove si n
trova il numero di frame.
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
Per ffmpeg
non avere frame duplicati, devi forzare metà del framerate dell'input, quindi imposta "2" come input e "1" sull'output. Non dimenticare di sostituire il WxH con le dimensioni effettive della clip perché il bitstream grezzo non ha un'intestazione che trasporta queste informazioni.
Invece di quanto sopra, un'altra possibilità sarebbe quella di aggiungere il setpts
filtro per impostare nuovi timestamp per l'output. Ma fai attenzione poiché lascia cadere i fotogrammi in modo non accurato. Qui, 25 è il frame rate di output effettivo desiderato:
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
Puoi ovviamente scegliere un altro formato di pixel (uno dei ffmpeg -pix_fmts
). Assicurarsi che durante la lettura del file si conoscano le dimensioni e il formato dei pixel:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …