特定のビデオファイルの一連のサムネイルを作成するための、短くて簡単な方法を探しています。私はffmpegを使ってもうすぐそこにいます、これが私が持っているものです:
ffmpeg -i /tmp/video.avi -r 1 -ss 60 -r 1 foo-%03d.jpeg`
唯一の問題は、これが毎秒ショットを撮るということです、そして私は毎分かそこらでそれを作りたいです。 -r
の値を1/60
または.02
に設定してみました。
参考までに、これが私が使用していた古いスクリプトで、一部のファイルでのみ機能しました。
#!/bin/bash
# grab a screenshot every 60 seconds
file=$1
orig_dir=`pwd`
mins=`exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | grep --only-matching '[0-9]*'`
dir="$file-screenshots"
mkdir "$dir"
cd "$dir"
mplayer -vo png -vf screenshot -sstep 60 -frames $mins -ao null "../$file"
cd "$orig_dir"
これはコマンドラインにある必要はありません。常に最も簡単になるだけです。
ffmpegのマンページ を参照してください。あなたが欲しい-vframes
:
-vframes
番号
録画するビデオフレームの数を設定します。
同じことをしている人の この例 も参照してください。元のメッセージは、-r
は、1未満の引数では正しく機能しないようです。代わりに、この種のコマンドラインを使用して1つのフレームを取得することをお勧めします(Xはファイル内で前方を探す時間です)。
ffmpeg -ss X -i input.movie.file -an -vframes 1 ouput.png
次に、シェルスクリプトを使用してそれをループし、(a)取得するフレーム数、および(b)ビデオの長さに基づいてXを自動生成します。古いサンプルスクリプトはすでに(b)を見つけているので、必要な入力は(a)だけです。
# generate NFRAMES frames in a movie 90 minutes long
mins=$(exiftool "$file" | grep "Duration" | awk -F : '{print $2}' | grep --only-matching '[0-9]*')
dir="$file-screenshots"
mkdir "$dir"
for i in $(seq 1 $NFRAMES);
do
ffmpeg -ss $(echo "$i * $mins" | bc -l) -i "$file" -an -vframes 1 "$dir/$i.png";
done