FFMPEG: Преобразование видео в анимированный GIF-файл. Предварительный просмотр с получением кадра после интервала

FFMPEG: Преобразование видео в анимированный GIF-файл. Предварительный просмотр с получением кадра после интервала

Я хотел бы создать превью в формате GIF для своего приложения и разместить его на своем сервере с помощью FFMPEG.

Он должен генерировать gif-файл, получая 10 кадров для каждого видео, но без использования временного каталога (или временных файлов, относящихся к каждому кадру), если это возможно.

Относительно этого ответа насуперпользователь.com, он должен генерировать gif, используя каждый кадр, это мне не нужно.

Кажется странным, но нужный мне эффект можно увидеть на многих порносайтах (не помню на каких именно).

решение1

Если я правильно вас понял,эта статья на Wiki FFmpeg называется «Создание миниатюры каждые X секунд видео»показывает, что FFmpeg не может сделать то, что вы от него хотите (без некоторых автоматизированных вычислений).

Вики говорит, что -vf "fps=fps=XYZ"это ваш лучший шанс - он создаст одну миниатюру/кадр на каждые XYZкадры исходного видео. Если вы действительно хотите 10 изображений на видео, и все они имеют разную длину, вы можете сначала прочитать общее количество кадров, а затем рассчитать необходимое количество кадров в секунду с помощью скрипта:

XYZ=wanted_frames_times_actual_fps/total_frames_of_vid

например wanted_frames_times_actual_fps, 10*25(PAL) или 10*30(NTSC) в вашем случае и total_frames_of_vid=(hh*3600+mm*60+ss)*25+ff, где hhозначает часы, mmозначает минуты, ssозначает секунды и ffозначает кадры (после последней подсчитанной секунды).Пример расчета: тайм-код 01:35:45:24(или 01:35:45.960в терминах FFmpeg, поскольку FFmpeg использует не кадры, а миллисекунды) при 25 кадрах в секунду соответствует в общей сложности 143649 кадрам.

Это решение вполне может сработать — вам просто нужно найти способ получить общее время видео (например, через ffprobe) и его частоту кадров в секунду (если вы не можете получить правильный таймкод), а затем сохранить эту информацию в виде переменной с именем $total_frames_of_vid.


Я нашел другой подход к этому вопросу в разделе «Также см.» вики, ссылаясь на вопрос суперпользователя под названием «Значимые миниатюры для видео с использованием FFmpeg»что предполагает использование:

ffmpeg -hide_banner -i <YOUR_VIDEO> -vf "select=gt(scene\,0.8)" -frames:v 10 -vsync vfr -vf "fps=fps=1/200" -y out%03d.png

(Я немного изменил код — изменил кодек изображения на PNG и изменил значения для -frames:vи fps. Также изменил выходные изображения, чтобы в их именах было три цифры.)

а затем перекодировать их в GIF-файл.

Это решение также требует некоторых вычислений или ручного труда, поскольку значения всех параметров (особенно fpsнеобходимо менять в зависимости от продолжительности видео). Например, я попробовал оригинальный код от суперпользователя с 35-минутным видео — и получил только 5 кадров.

Связанный контент