Как ускорить или замедлить видеоролик с помощью FFmpeg

Бывает что нужно замедлить видеоролик, чтобы он воспроизводился как будто в режиме замедленного воспроизведения, а иногда  наоборот, сделать словно «на перемотке» , выбросить часть кадров и ускорить воспроизведение.Рассмотрим как это сделать с помощью ffmpeg и yuvfps из пакета mjpegtools.

Итак, чтобы ускорить видео, нужно взять исходный файл и посмотреть, какая в нём частота кадров

$ffmpeg -i normal.ogg
FFmpeg version SVN-r13582, Copyright (c) 2000-2008 Fabrice Bellard, et al.
...
Input #0, ogg, from 'normal.ogg':
  Duration: 00:00:10.49, start: 0.000000, bitrate: 150 kb/s
    Stream #0.0: Video: theora, yuv420p, 320x240 [PAR 1:1 DAR 4:3], 30.00 tb(r)
Must supply at least one output file


В данном случае исходный файл — имеет 30 кадров в секунду. Нужно решить, во сколько раз уменьшить число кадров. Потом берём исходный файл (normal.ogg в примере) и преобразовываем его в YUV4MPEG-поток (первый вызов ffmpeg), после нужно дважды вызвать yuvfps, первый раз, чтобы изменить число кадров в потоке (yuvfps -s 5:2 -r 1:1 сокращает исходные 2.5 кадра до одного), второй раз, чтобы перезаписать заголовок потока, указав скорость воспроизведения (yuvfps -r 30:1 -c устанавливает скорость 30 кадров в секунду). В конце опять вызываем ffmpeg и кодируем уже в нужный формат:

$ ffmpeg -i normal.ogg -sameq -f yuv4mpegpipe - | \
  yuvfps -s 5:2 -r 1:1 | yuvfps -r 30:1 -c | \
  ffmpeg -f yuv4mpegpipe -i - -sameq -y fast.ogg



Аналогично можно увеличить число кадров. Дополнительные кадры интерполируются:

$ ffmpeg -i normal.ogg -sameq -f yuv4mpegpipe - | \
  yuvfps -s 1:3 -r 1:1 | yuvfps -r 30:1 -c | \
  ffmpeg -f yuv4mpegpipe -i - -sameq -y slow.ogg


В этот раз видео замедляется в 3 раза: на каждую «треть» исходного кадра (-s 1:3) создаётся целый кадр (-r 1:1). Вообще, в качестве частоты кадров для yuvfps можно указывать любые дроби в виде числитель:знаменатель.