Для точной работы сначала преобразуйте видео в битовый поток 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 …