我正在使用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
答案 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)以获得正确的输出