Слайд-шоу ffmpeg с кроссфейдом

1596
Michael

Я только что понял, как сделать слайд-шоу с кроссфейдом. Это двухступенчатый процесс. На первом этапе считываются изображения с частотой кадров 0,5 (что означает 2 секунды для каждого изображения) и создается промежуточное видео с частотой кадров 2. Это означает, что каждое изображение повторяется 4 раза. На втором этапе применяется фильтр частоты кадров. В результате каждый снимок показывается в течение 1,5 секунд, после чего следует переход за 0,5 секунды.

ffmpeg -framerate 0.5 -i IMG_% 3d.jpg -r 2 -кодек: v mpeg4 temp.mp4

ffmpeg -i temp.mp4 -vf "framerate = fps = 25" -кодек: v mpeg4 out.mp4

Этот двухэтапный процесс работает нормально, но у меня есть два вопроса:

  1. Можно ли получить такой же результат за один шаг без промежуточного видеофайла?
  2. Если ответ на первый вопрос - «нет», может кто-нибудь показать мне, как должны быть изменены вышеуказанные команды для промежуточного файла без потерь, например, RAWVIDEO?

Спасибо майкл

2
По какой-либо причине вам нужен `mpeg4` в качестве кодека? Использование этого конкретного кодера без установки какого-либо целевого битрейта или уровня качества приведет к получению плохого качества. Я бы предпочел использовать H.264, если вам не нужно специально ориентироваться на устройство, которое его не поддерживает. slhck 7 лет назад 0
Я опустил настройки битрейта и уровня качества в приведенном выше примере, потому что я хотел, чтобы он был как можно более коротким. Michael 7 лет назад 0

2 ответа на вопрос

2
Michael

Я хотел бы подвести итог решения:

ffmpeg -i IMG_%3d.jpg -vf zoompan=d=(A+B)/B:s=WxH:fps=1/B,framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 out.mp4 

где A - это длительность в секундах, показывающая, как долго показывается каждое изображение (без длительности перехода), B - продолжительность перехода в секундах, а WxH - размер выходного видео.

`-b: v 5M` и` -q: v 0` являются взаимоисключающими; либо вы хотите определенный битрейт (но тогда лучше было бы использовать двухпроходное кодирование), либо вы указываете целевой уровень качества (однако ´-q: v 0` приведет к очень большому файлу). slhck 7 лет назад 0
Разве указанный битрейт не работает только как максимум в этом случае? Я думаю, что когда оба параметра указаны, это означает использование указанного качества, но не превышение указанного битрейта. Michael 7 лет назад 0
Нет, это параметр `-maxrate`. Если вам действительно нужно `mpeg4`, используйте` -q: v 2 -maxrate 5M` для видео 1080p, например, для достижения потока VBR с ограниченной скоростью. slhck 7 лет назад 0
1
Gyan

Вы можете переделать кадры перед применением фильтра:

ffmpeg -i IMG_%3d.jpg -vf "setpts=N/0.5/TB,framerate=fps=25" -codec:v mpeg4 out.mp4 

Обновление : Фильтр частоты кадров, похоже, привязан к входной частоте кадров при приеме, поэтому альтернативный метод с использованием каналов

ffmpeg -framerate 0.5 -i IMG_%3d.jpg -vf fps=2 -f nut - | ffmpeg -f nut -i - -vf framerate=25 -c:v mpeg4 out.mp4 

Обход в одну строку:

ffmpeg -i IMG_%3d.jpg -vf zoompan=z=1:d=4:s=WxH:fps=2,framerate=25 -c:v mpeg4 out.mp4 

где W и H заменены входными размерами.

Но это не то же самое. Он создает видео, где длительность перехода составляет 2 секунды, а когда заканчивается один переход, немедленно начинается следующий переход. Michael 7 лет назад 0
Обходной путь добавлен Gyan 7 лет назад 0
хорошо, я понимаю, что вы имеете в виду. Сначала примените фильтр fps, а затем фильтр частоты кадров. Но я вызываю ffmpeg из командного файла Windows. Я думаю, что в этом случае я должен написать команды в две строки и использовать промежуточный файл. Michael 7 лет назад 0
Зачем? Вы можете применить обходной путь в командном файле. Gyan 7 лет назад 0
Не работает Когда я запускаю командный файл, окно cmd.exe открывается и закрывается немедленно. Это содержимое моего командного файла: c: / ffmpeg / ffmpeg -framerate 0.5 -i IMG _ %% 3d.jpg -vf fps = 2 -f nut - | c: / ffmpeg / ffmpeg -f nut -i - -vf framerate = 25 -c: v mpeg4 out.mp4 pause Michael 7 лет назад 0
команда паузы находится в новой строке Michael 7 лет назад 0
Обход в одну строку с фильтром zoompan отлично работает! В ней есть небольшая опечатка, замените "d: 4" на "d = 4". Большое спасибо! Michael 7 лет назад 0
«-framerate 0.5» в начале может быть опущен. «z = 1» также может быть опущено, это значение по умолчанию. Michael 7 лет назад 0

Похожие вопросы