我看到了此线程,它几乎完全满足我的要求,但我实际上是在寻找场景检测的分割。
在黑帧(场景变化)处自动将较大的 .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。
准确性不会是完美的,除非您完全控制传入的内容,否则您可能会遇到大量问题。
值得注意的是,这类工作是当前的研究课题,因此,它可能会产生不完美的结果。