web-dev-qa-db-ja.com

FFMPEGの使用:シーンの変化を検出する方法タイムコードで?

この記事に基づいて、ビデオのシーンの変化を検出するためにFFMPEGを使用することが可能であるようです: http://www.luckydinosaur.com/u/ffmpeg-scene-change-detector

これで、本のテキストを表示するビデオがあり、テキスト(単語または文)が読み上げられると強調表示されます。このオーディオブックのようなもの: https://youtu.be/lA7L6ZNVKjc

テキストが強調表示されたときのタイムスタンプを知る必要があるため(シーンの変更)、これによりYouTubeビデオにタイムスタンプタグを追加できるようになり、リスナーがオーディオブックをナビゲートしやすくなります。

これを行うmagicコマンドラインとは何ですか?

どうもありがとうございました!

16
Mozart

scene フィルター(シーンの変化を検出するため)と showinfo フィルターを組み合わせることで、目的を達成できます。

ffmpeg -i input.flv  \
       -filter:v "select='gt(scene,0.4)',showinfo" \
       -f null \
       - 2> ffout

このコマンドは、前のフレームと(gt0.4より大きい(0から1まで)異なるすべてのフレームを抽出します。これらのフレームの場合、情報は次のように出力されます(showinfo

[Parsed_showinfo_1 @ 0x2d85e60] n:   0 pts:2537204 pts_time:2.5372  pos:  2998114 fmt:rgb24 sar:1/1 s:1920x1200 i:P iskey:1 type:I checksum:5616582E plane_checksum:[5616582E]

これで、タイムスタンプを抽出するだけで済みます。 pts_timeに興味があると思います。次のようにすることができます:

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps

これにより、すべてのタイムスタンプのリストが表示されます。

2.5372
4.37799
6.65301
8.09344

このアプローチが機能するには、シーン検出を実装するFFmpegのバージョンが必要です。また、しきい値に適切な値を選択する必要があります(最初のコマンドの0.4)。このように、さまざまなしきい値のフレームを抽出することで、最適なしきい値を見つけようとすることができます(その後、フレームを手動で検査します)。

ffmpeg -i input.flv \
       -filter:v "select='gt(scene,0.1)',showinfo" \
       -vsync 0 frames/%05d.jpg

明確にするために:grep [0-9.]*は、別の回答で主張されている整数を除外しません。数字とピリオドで構成される任意の文字シーケンスに一致しますが、「4.4.4」などの非数字にも一致します。ただし、ffmpegはそのような不正な形式のタイムスタンプを出力すべきではありません。

20
ckoehn

上記の答えにコメントを投稿する担当者はいませんが、@ ckoehnと@keypulsationsの両方によって投稿されたgrepは、浮動小数点のタイムスタンプのみを取得することを指摘したかったのです。浮動小数点と整数の両方のタイムスタンプを取得するには、次の正規表現を使用します

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps
8
Luke Harrison

@ckoehnの回答を試してみましたが、機能しなくなるまで、最後のgrepのアスタリスクが問題を引き起こしていました。これを回避するには、次のようなgrep文で二重引用符を使用することをお勧めします。

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep "[0-9.]*" -o > timestamps
3

次のコマンドを簡単に使用できます。

ffmpeg inputvideo.mp4 -filter_complex "select='gt(scene,0.3)',metadata=print:file=time.txt" -vsync vfr img%03d.png

これにより、time.txtファイルに以下のような関連情報のみが保存されます。

frame:0    pts:108859  pts_time:1.20954
lavfi.scene_score=0.436456
frame:1    pts:285285  pts_time:3.16983
lavfi.scene_score=0.444537
frame:2    pts:487987  pts_time:5.42208
lavfi.scene_score=0.494256
frame:3    pts:904654  pts_time:10.0517
lavfi.scene_score=0.462327
frame:4    pts:2533781 pts_time:28.1531
lavfi.scene_score=0.460413
frame:5    pts:2668916 pts_time:29.6546
lavfi.scene_score=0.432326

フレームは、開始から検出されたショット変更のシリアル番号です。また、ユースケースに適したしきい値(ここでは0.3)を選択して、正しい出力を取得します

2
Legolas