Щоб точно працювати, спочатку перетворіть відео в бітовий потік RAW YUV (якщо його ще немає):
ffmpeg -i input.mp4 -an -vcodec rawvideo -pix_fmt yuv420p rawbitstream.yuv
Наступний крок: selectФільтр приймає вираз , де nзнаходиться номер кадру.
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
Щоб ffmpegне дублювати кадри, ви повинні примусити половину частоти кадрів вашого вводу - так ви встановите "2" як вхід, а "1" на вихід. Не забудьте замінити WxH фактичними розмірами кліпу, оскільки в сирому бітовому потоці немає заголовка, який містить цю інформацію.
Замість сказаного, іншою можливістю було б додати setptsфільтр, щоб встановити нові часові позначки для виводу. Але будьте обережні, оскільки вона не точно опускає кадри. Ось 25 - це фактична вихідна частота кадрів, яку ви бажаєте:
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
Ви, звичайно, можете вибрати інший формат пікселів (будь-який з ffmpeg -pix_fmts). Переконайтесь, що, читаючи файл, ви знаєте розмір пікселя та формат пікселя:
ffmpeg -f rawvideo -s:v 1280x720 -pix_fmt yuv420p input.yuv …