web-dev-qa-db-ja.com

ffmpegを使用したビデオサムネイル

特定のビデオファイルの一連のサムネイルを作成するための、短くて簡単な方法を探しています。私は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"

これはコマンドラインにある必要はありません。常に最も簡単になるだけです。

3
Michael Lenzen

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
3
quack quixote