ビデオからキーフレームを抽出するためにffmpegを使用しています。これはコマンドです:
ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
ビデオで抽出された各キーフレームのインデックスを取得するにはどうすればよいですか?たとえば、最初のIフレームの場合、インデックスは0、2番目の場合は24になります。
ビデオからキーフレームを抽出するためにffmpegを使用しています。これはコマンドです:
ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg
ビデオで抽出された各キーフレームのインデックスを取得するにはどうすればよいですか?たとえば、最初のIフレームの場合、インデックスは0、2番目の場合は24になります。
回答:
前述の@dstobのように、ffprobe
Iフレームとそれに関連する情報を取得するために使用できます。ダウンロードページにffprobe
いくつかの静的ビルドが付属しており、ソースからビルドすることもできます。
これは、Linux / Unixを使用していることを前提としています。
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1
このgrep
コマンドはI
、その中の行をフィルタリングし、そのインデックスをカウントします(-n
オプションを使用)。このcut
コマンドは、出力(インデックス)の最初の列のみを選択します。このインデックスは0ベースではなく1ベースであることに注意してください。
実際にこれらのインデックスをリストにパイプすることができます:
ffprobe -select_streams v -show_frames \
-show_entries frame=pict_type \
-of csv bbb480.avi \
| grep -n I | cut -d ':' -f 1 > frame_indices.txt
次に、すべてのサムネイルのリストも作成します。
ls -1 thumbnails*.jpeg > thumbnails.txt
次に、これら2つを貼り付けます。
paste thumbnails.txt frame_indices.txt > combined.txt
リストには、サムネイルの名前とインデックスが含まれています。これに基づいて名前変更を実行します。
while read -r thumbnail index; do
newIndex=$(echo $index - 1 | bc) # subtract 1 from the index
mv -- "$thumbnail" "thumbnail-$newIndex.jpeg" # rename file
done < combined.txt
上記の名前はに変更さthumbnail-01.jpeg
れthumbnail-0.jpeg
ます。出力インデックスにはゼロパディングがないことに注意してください。たとえば、5桁にゼロ詰めする場合は、次のように使用しますprintf
。
newIndex=$(printf '%05d' $(echo $index - 1 | bc))
Windowsでは、まったく同じことを行いますffprobe
が、出力の解析は異なります。そこで名前を変更する方法はわかりません。
[FRAME]
行と1 [/FRAME]
行に1 pict_type
行あるため、3倍ずれていると思います。
-of csv
オプションを使用する場合、フレームごとに1行しかありませんffprobe
。ただし、説明しているのはデフォルトの出力形式です。
最初に述べたようにFFMPEGを使用したい場合は、次のようにして、すべてまたは一部のリストを一覧表示し、jpgを作成できます。
ffmpeg.exe \
-i "C:\Users\UserName\Desktop\jpegs and list\VideoName.mp4" \
-t 15 \
-vf select="eq(pict_type\,PICT_TYPE_I)" \
-vsync 2 \
-s 160x90 \
-f image2 thumbnails-%02d.jpeg \
-loglevel debug 2>&1| for /f "tokens=4,8,9 delims=. " %d in ('findstr "pict_type:I"') do echo %d %e.%f>>"keyframe_list.txt"
-t 15
時間制限なしで削除するか、必要に応じて変更してください。削除する-s 160x90 -f image2 thumbnail-%02d.jpeg
か、サムネイルの削除に合わせて変更します。