如何用ffmpeg保存帧数?

时间:2016-05-14 15:03:01

标签: ffmpeg

我正在使用ffmpeg扫描视频文件以进行场景更改,并将结果保存到文本文件中。我在下面使用的代码工作,但我想简化结果,只输出场景发生变化的帧号,而不是这段代码产生的所有数据。有什么建议吗?

ffprobe -show_frames -of compact=p=0 -f lavfi "movie=input.mov,select=gt(scene\,.02)" > results.txt

输出所有这些:

media_type=video    stream_index=0  key_frame=1 pkt_pts=31031   pkt_pts_time=1.292958   pkt_dts=31031   pkt_dts_time=1.292958   best_effort_timestamp=31031 best_effort_timestamp_time=1.292958 pkt_duration=N/A    pkt_duration_time=N/A   pkt_pos=82320   pkt_size=629760 width=640   height=328  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.025551  

2 个答案:

答案 0 :(得分:1)

要获得符合场景变化标准的帧索引号,请使用

 ffprobe -select_streams v -show_entries frame=pkt_pts -of compact=p=0:nk=1 \
         -f lavfi "movie=abc.mov,setpts=N+1,select=gt(scene\,.02)" > log.txt

日志文件将只包含帧索引号,每行一个,例如

135
136
137
141
143
145 

setpts从1开始编号。

答案 1 :(得分:0)

您可以简单地使用以下命令:

ffmpeg inputvideo.mp4 -filter_complex "select='gt(scene,0.3)',metadata=print:file=time.txt" -vsync vfr img%03d.png

这只会将相关信息保存在time.txt文件中,如下所示:

frame:0    pts:108859  pts_time:1.20954
lavfi.scene_score=0.436456
frame:1    pts:285285  pts_time:3.16983
lavfi.scene_score=0.444537
frame:2    pts:487987  pts_time:5.42208
lavfi.scene_score=0.494256
frame:3    pts:904654  pts_time:10.0517
lavfi.scene_score=0.462327
frame:4    pts:2533781 pts_time:28.1531
lavfi.scene_score=0.460413
frame:5    pts:2668916 pts_time:29.6546
lavfi.scene_score=0.432326

此外,为您的用例选择合适的阈值(此处为0.3)以获得正确的输出