GIFを作成したいフォルダーに何百ものビデオがあります。動画の長さはそれぞれ異なりますが、すべての動画の長さが30秒を超えています。ビデオの経過中にビデオから10 3秒のgif画像を取得したいと考えています。たとえば、ビデオの長さが25分の場合、3秒recorded gifは2.5分(150秒)ごとに撮影する必要があります。
完成したgifも動画と同じ名前である必要がありますが、末尾が.gifであるすべての動画は.mp4です。
Gifは560x340である必要があります
これを1つのコマンドで実行すると便利です。
手順:
ffprobe
で期間を取得 。スクリプトの例:
#!/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
これにより、多くの要件が満たされます。
ffmpeg
)コマンド