Как я могу создать 30-секундный GIF из длинного случайного видео?
У меня есть сотни видео в папке, для которой я хочу сделать подарок. Длина каждого видео различна, но все видео длиннее 30 секунд. Я хочу взять 10 3 секундных GIF-изображений из видео в течение видео. Например, если видео длится 25 минут, каждые 2,5 минуты (150 секунд) следует делать 3-х секундный записанный GIF.
Готовые гифки также должны иметь то же имя, что и видео, но заканчиваться на.gif, все видео -.mp4
Гифки должны быть 560х340
Было бы неплохо сделать это с помощью одной команды.
1 ответ
Решение
Шаги :
- Получить продолжительность с
ffprobe
, - Используйте длительность в качестве значения в фильтре выбора.
- Создать GIF.
- Сценарий все.
Пример скрипта:
#!/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