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

aro*_*ick 20 video ffmpeg video-editing

我看到了这个线程,它几乎完全符合我的要求,但我实际上正在寻找场景检测的拆分。

自动将大型 .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
Run Code Online (Sandbox Code Playgroud)

这给了我一个似乎完全正确的时间戳列表!现在下一步 - 我如何获取这个时间戳列表并将它们输入回 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
Run Code Online (Sandbox Code Playgroud)

Del*_*gan 7

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

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

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

  • 你是如何制作小视频的?上面的命令创建 png 图像而不是较小的 mp4 视频。 (3认同)