我文件夹中有数百个视频,我想为它们制作一个 gif。每个视频的长度都不同,但所有视频都超过 30 秒。我想在视频播放过程中从视频中截取 10 个 3 秒的 gif 图像。例如,如果视频长度为 25 分钟,则 3 秒已录制每 2.5 分钟(150 秒)应拍摄一次 gif。
完成的 gif 也必须具有与视频相同的名称,但以 .gif 结尾,所有视频均为 .mp4
GIF 尺寸应为 560x340
用一个命令来完成这个任务就好了。
答案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
) 命令 - 使用 bashfor 循环这样你就可以自动转换数百个视频
- 输出名称与输入名称相同,但将 .mp4 替换为 .gif