web-dev-qa-db-ja.com

長いランダムビデオから30秒のGIFを作成するにはどうすればよいですか?

GIFを作成したいフォルダーに何百ものビデオがあります。動画の長さはそれぞれ異なりますが、すべての動画の長さが30秒を超えています。ビデオの経過中にビデオから10 3秒のgif画像を取得したいと考えています。たとえば、ビデオの長さが25分の場合、3秒recorded gifは2.5分(150秒)ごとに撮影する必要があります。

完成したgifも動画と同じ名前である必要がありますが、末尾が.gifであるすべての動画は.mp4です。

Gifは560x340である必要があります

これを1つのコマンドで実行すると便利です。

8
Toodarday

手順:

  1. ffprobeで期間を取得
  2. select フィルターの値として期間を使用します。
  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

これにより、多くの要件が満たされます。

  • 3秒のセグメントで構成される30秒のGIFを出力します。
  • 560x340出力サイズ
  • 1つの(ffmpeg)コマンド
  • 何百ものビデオを自動的に変換できるようにbashfor loopを使用する
  • 出力名は入力名と同じですが、.mp4が.gifに置き換えられています
9
llogan