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

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

我看到了此线程,它几乎完全满足我的要求,但我实际上是在寻找场景检测的分割。

在黑帧(场景变化)处自动将较大的 .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

答案1

您可以直接使用ffmpeg它来动态检测和提取场景,而无需打印和解析帧信息:

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

-vsync vfr是必需的,因为默认情况下图像提取不适用于可变帧速率,请参阅第 1644 章

答案2

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

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

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

相关内容