(シーンの変化を検出するための)sceneフィルタを組み合わせるとshowinfoフィルタは、あなたが望むものを達成する必要があります
ffmpeg -i input.flv -filter:v "select='gt(scene,0.4)',showinfo" -f null - 2> ffout
このコマンドは、抽出により、前のフレームと異なるすべてのフレームを((gt
)0.4
より0
から1
までの尺度で)。これらのフレームについて、情報がこの
[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]
のように(showinfo
)プリントアウトされた今、あなただけのタイムスタンプを抽出する必要があります。 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はそのような不正な形式のタイムスタンプを出力すべきではありません。
を使用する浮動小数点および整数のタイムスタンプの両方をつかむ「[0-9] * \。[0-9] *」-o'しますは、 'grep showinfo ffout | grep pts_time:[0-9。] * -o | grep '[0-9] * \。[0-9] *' -o>タイムスタンプ ' '.'はエスケープする必要があります。そうでない場合は任意の文字に一致します – keypulsations
@keypulsations、[[]]は一致しません任意の文字 '.'が行います。 '[。]'は大括弧の式で、大かっこの間の任意の1文字にマッチします。[文字クラスとブラケット式のgrepマニュアル](https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes-ブラケット式)。 'grep [0-9。] *'は浮動小数点数や整数以上にもマッチしますが(実際にはこのパイプラインにはありません)、正規表現では整数を除外して他の答えで指摘することがあります。 – ckoehn