如何从长随机视频创建 30 秒的 GIF?

Too*_*day 9 ffmpeg mp4 gif

我在一个文件夹中有数百个视频,我想为其制作 gif。每个视频的长度都不同,但所有视频的长度都超过 30 秒。我想在整个视频过程中从视频中获取 10 个 3 秒的 gif 图像。例如,如果视频时长为 25 分钟,则应每 2.5 分钟(150 秒)拍摄3 秒录制的gif。

完成的 gif 也必须与视频同名,但以 .gif 结尾,所有视频均为 .mp4

gif 应为 560x340

用一个命令来做到这一点会很好。

llo*_*gan 10

脚步:

  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
Run Code Online (Sandbox Code Playgroud)

这可以满足您的许多要求:

  • 输出 30 秒 GIF 由 3 秒段组成,同样跨越输入持续时间
  • 560x340 输出尺寸
  • 一 ( ffmpeg) 命令
  • 使用 bash for 循环,以便您可以自动转换数百个视频
  • 输出名称与输入名称相同,但 .mp4 替换为 .gif