通过场景检测使用FFMPEG分割视频


17

我看到了这个线程,几乎可以完全满足我的需求,但是我实际上正在寻找场景检测方面的分裂。

自动将大型.mov视频文件拆分为黑框的较小文件(场景更改)?

例如,假设我从0:01-> 0:05开始在屏幕上放一个女人,然后从0:06-> 0:09在另一个场景中放一个男人,而从0:10开始在屏幕上放另一个女人- > 0:14

(理想情况下)这将创建三个不同的视频剪辑。如果可能的话,我真的很想将其降低到帧级别,并在场景变化时自动检测。

** 更新 **

好的,我已经有了一个很好的开端。我已经使用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

不要将新问题编辑到现有的问题中,也不要提出新问题,并参考此方法获得时间戳。
djsmiley2k-CoW

Answers:


4

您可以直接用于ffmpeg实时检测和提取场景,而无需打印和解析帧信息:

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

-vsync vfr是必需的,因为图像提取不与默认可变帧率工作,见#1644


此方法使ffmpeg崩溃并发出警告More than 1000 frames duplicated
ashleedawg

1
您实际上是如何制作这些小型视频的?上面的命令创建png图像,而不是较小的mp4视频。
Juan Pablo Fernandez

3

处理您的文本以获取时间戳并将其打印为.txt文件,请在ffmpeg分段器中使用.txt。

准确性将不是完美的,除非您完全控制传入的内容,否则您可能会遇到很多问题。

值得注意的是,这类工作是当前的研究主题,因此,再次进行,可能会产生不完美的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.