ffmpegを使用してビデオからキーフレームのインデックスを抽出する


17

ビデオからキーフレームを抽出するためにffmpegを使用しています。これはコマンドです:

ffmpeg -i test2.mp4 -vf select='eq(pict_type\,I)' -vsync 2 -s 160x90 -f image2 thumbnails-%02d.jpeg

ビデオで抽出された各キーフレームのインデックスを取得するにはどうすればよいですか?たとえば、最初のIフレームの場合、インデックスは0、2番目の場合は24になります。



ffprobeの使用を検討し、出力を後処理してインデックスを取得しますか?
dstob 2015年

@dstobはどういう意味ですか?私はffmpegが初めてなので。
Faten Khalifa 2015

@LordNeckbeardビデオフレーム内のフレーム番号。ビデオの最初のフレームはインデックス0になります。ビデオフレームの各キーフレームのインデックスを知りたいです。
Faten Khalifa 2015

サムネイルに(画像自体に)フレーム番号を印刷しますか?
llogan 2015年

回答:


21

前述の@dstobのように、ffprobeIフレームとそれに関連する情報を取得するために使用できます。ダウンロードページに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.jpegthumbnail-0.jpegます。出力インデックスにはゼロパディングがないことに注意してください。たとえば、5桁にゼロ詰めする場合は、次のように使用しますprintf

newIndex=$(printf '%05d' $(echo $index - 1 | bc))

Windowsでは、まったく同じことを行いますffprobeが、出力の解析は異なります。そこで名前を変更する方法はわかりません。


このエラーが表示されます。「grep」は、内部または外部のコマンド、操作可能なプログラム、またはバッチファイルとして認識されません。
Faten Khalifa 2015

2
これは、Windowsを使用しているためです。私が言ったように、この答えはLinuxまたはUnixを想定しています。あなたはあなたの質問でより具体的ではありませんでした。Cygwinまたは同様のWindows用のGNU / Linuxレイヤーを使用して、Windowsでも同じことを実現できます。
slhck

これは大きな助けです、ありがとう。1つの修正:最初のコマンドのインデックスは、1 [FRAME]行と1 [/FRAME]行に1 pict_type行あるため、3倍ずれていると思います。
Jack O'Connor

2
@ JackO'Connorの-of csvオプションを使用する場合、フレームごとに1行しかありませんffprobe。ただし、説明しているのはデフォルトの出力形式です。
slhck 2015

0

最初に述べたように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か、サムネイルの削除に合わせて変更します。


Windows 7 CMDでは、これは\で失敗します。\を^に変更すると、:I "で失敗します。Windowsで動作するバージョンはありますか?
ChrisJJ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.