web-dev-qa-db-ja.com

FFMPEGを使用したシーン検出によるビデオの分割

私はこのスレッドを見て、私が望んでいることをほぼ正確に実行しますが、実際にはシーン検出の分割を探しています。

大きな.movビデオファイルを黒いフレームで自動的に小さなファイルに分割します(シーンの変更)?

たとえば、私が0:01-> 0:05から画面に女性がいて、次に0:06-> 0:09から別のシーンに男がいて、0:10から2人目の女性が画面にいるとします。 > 0:14

これにより(理想的には)3つの異なるビデオクリップが作成されます。できればフレームレベルまで下げて、シーンが変化したときに自動検出できるようにしたいと思います。

** 更新しました **

さて、私は素晴らしいスタートを切っています。 FFProbeを使用して以下を実行しました。

ffprobe -show_frames -of compact=p=0 -f lavfi "movie=foo.mp4,select=gt(scene\,.4)" > foo.txt

これにより、正確に見えるタイムスタンプのリストが表示されます。次のステップ-このタイムスタンプのリストを取得して、ffmpegに入力し、分割する方法を教えてください。タイムスタンプの例を次に示します。

media_type=video|key_frame=1|pkt_pts=972221|pkt_pts_time=10.802456|pkt_dts=972221|pkt_dts_time=10.802456|best_effort_timestamp=972221|best_effort_timestamp_time=10.802456|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=5083698|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=0.503364
media_type=video|key_frame=1|pkt_pts=2379878|pkt_pts_time=26.443089|pkt_dts=2379878|pkt_dts_time=26.443089|best_effort_timestamp=2379878|best_effort_timestamp_time=26.443089|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=12736403|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=1.000000
media_type=video|key_frame=1|pkt_pts=2563811|pkt_pts_time=28.486789|pkt_dts=2563811|pkt_dts_time=28.486789|best_effort_timestamp=2563811|best_effort_timestamp_time=28.486789|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=13162601|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=0.745838
media_type=video|key_frame=1|pkt_pts=2627625|pkt_pts_time=29.195833|pkt_dts=2627625|pkt_dts_time=29.195833|best_effort_timestamp=2627625|best_effort_timestamp_time=29.195833|pkt_duration=N/A|pkt_duration_time=N/A|pkt_pos=13485087|pkt_size=6220800|width=1920|height=1080|pix_fmt=rgb24|sample_aspect_ratio=1:1|pict_type=I|coded_picture_number=0|display_picture_number=0|interlaced_frame=0|top_field_first=0|repeat_pict=0|tag:lavfi.scene_score=0.678877
17
aronchick

ffmpegを直接使用して、フレーム情報を印刷および解析することなく、その場でシーンを検出および抽出できます。

ffmpeg -i foo.mp4 -vf select='gt(scene\,0.4)' -vsync vfr frame%d.png

-vsync vfrが必要なのは、デフォルトでは可変フレームレートでは画像抽出が機能しないためです #1644 を参照してください。

4
Delgan

テキストを処理してタイムスタンプを取得し、.txtファイルに出力します。ffmpegセグメンターで.txtを使用します。

正確さは完璧ではありません、そしてあなたが入ってくるコンテンツを完全に制御できない限り、遭遇するかもしれない多くの問題があります。

このタイプの作業は現在の研究テーマであるため、やはり不完全な結果になる可能性があることに注意してください。

3
dstob