Щоб точно працювати, спочатку перетворіть відео в бітовий потік 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 …