Как я могу создать 30-секундный GIF из длинного случайного видео?

У меня есть сотни видео в папке, для которой я хочу сделать подарок. Длина каждого видео различна, но все видео длиннее 30 секунд. Я хочу взять 10 3 секундных GIF-изображений из видео в течение видео. Например, если видео длится 25 минут, каждые 2,5 минуты (150 секунд) следует делать 3-х секундный записанный GIF.

Готовые гифки также должны иметь то же имя, что и видео, но заканчиваться на.gif, все видео -.mp4

Гифки должны быть 560х340

Было бы неплохо сделать это с помощью одной команды.

1 ответ

Решение

Шаги :

  1. Получить продолжительность сffprobe,
  2. Используйте длительность в качестве значения в фильтре выбора.
  3. Создать GIF.
  4. Сценарий все.

Пример скрипта:

#!/bin/bash
mkdir 30gif
for f in *.mp4; do
  duration=$(ffprobe -loglevel error -show_entries format=duration -of default=nk=1:nw=1 "$f")
  ffmpeg -i "$f" -filter_complex "[0:v]select='lt(mod(t,${duration}/10),3)',setpts=N/(FRAME_RATE*TB),scale=560:340:force_original_aspect_ratio=decrease,pad=560:340:(ow-iw)/2:(oh-ih)/2,setsar=1,split[v0][v1];[v0]palettegen[p];[v1][p]paletteuse[v]" -map "[v]" "30gif/${f%.mp4}.gif"
done

Это соответствует вашим многочисленным требованиям:

  • Выходной 30-секундный GIF, состоящий из 3-х секундных сегментов, одинаково охватывающих длительность ввода
  • Выходной размер 560x340
  • Один (ffmpeg) команда
  • Использование bash for loop, чтобы вы могли автоматически конвертировать сотни видео
  • Имя вывода совпадает с именем ввода, но с.mp4 заменяется на.gif
Другие вопросы по тегам