2016-02-27 96 views
8

ビデオでシーンチェンジを検出するために、FFMPEGを使用することが可能であると思われる: 今http://www.luckydinosaur.com/u/ffmpeg-scene-change-detectorFFMPEGを使用する:シーンチェンジ検出を行うには?タイムコード付き?この記事に基づいて

私は本のテキストとする場合、テキスト(単語や文章)を表示するビデオがそれを話されています強調表示されます。このオーディオブックのような 何か:私はテキストがハイライト表示されます、タイムスタンプ(したがって、シーンチェンジを)知っている必要がありhttps://youtu.be/lA7L6ZNVKjc

が、これは私が私のユーチューブビデオのタイムスタンプのタグを追加することができますので、リスナーがナビゲートするのが容易になりますオーディオブックを通して。

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

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

答えて

8

(シーンの変化を検出するための)sceneフィルタを組み合わせるとshowinfoフィルタは、あなたが望むものを達成する必要があります

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

このコマンドは、抽出により、前のフレームと異なるすべてのフレームを((gt0.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

を使用する浮動小数点および整数のタイムスタンプの両方をつかむ「[0-9] * \。[0-9] *」-o'しますは、 'grep showinfo ffout | grep pts_time:[0-9。] * -o | grep '[0-9] * \。[0-9] *' -o>タイムスタンプ ' '.'はエスケープする必要があります。そうでない場合は任意の文字に一致します – keypulsations

+1

@keypulsations、[[]]は一致しません任意の文字 '.'が行います。 '[。]'は大括弧の式で、大かっこの間の任意の1文字にマッチします。[文字クラスとブラケット式のgrepマニュアル](https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html#Character-Classes-ブラケット式)。 'grep [0-9。] *'は浮動小数点数や整数以上にもマッチしますが(実際にはこのパイプラインにはありません)、正規表現では整数を除外して他の答えで指摘することがあります。 – ckoehn

4

私は上記の回答にコメントを投稿する担当者はいませんが、@ckoehnと@keypulsationsの両方によって投稿されたgrepは浮動小数点のタイムスタンプしか取得しないことを指摘したいと思います。最終grepのように、上記の最後のgrepは `のgrepであるべき次の正規表現

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps 
関連する問題