基于本文,似乎可以使用FFMPEG来检测视频中的场景变化:http://www.luckydinosaur.com/u/ffmpeg-scene-change-detector。
现在,我有一个视频,显示一本书的文本,当文本(单词或句子)被说出来时,它会被高亮显示。就像这本有声书:https://youtu.be/lA7L6ZNVKjc
当文本被突出显示时,我需要知道时间戳(因此场景发生了变化),这将允许我在youtube视频中添加时间戳标记,这样听众就可以更容易地浏览有声读物。
什么是神奇的命令行,可以做到这一点?
非常感谢!
发布于 2016-07-05 13:44:28
组合景物过滤器(用于检测场景更改)和展示信息过滤器应该可以实现您想要的结果:
ffmpeg -i input.flv \
-filter:v "select='gt(scene,0.4)',showinfo" \
-f null \
- 2> ffout
此命令提取与前一帧不同的所有帧,其大小为(gt
) 0.4
(从0
到1
)。对于这些帧,信息输出(showinfo
)如下所示
[Parsed_showinfo_1 @ 0x2d85e60] n: 0 pts:2537204 pts_time:2.5372 pos: 2998114 fmt:rgb24 sar:1/1 s:1920x1200 i:P iskey:1 type:I checksum:5616582E plane_checksum:[5616582E]
现在只需提取时间戳。我想你对pts_time
感兴趣。你可以这样做:
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps
这将给出所有时间戳的列表:
2.5372
4.37799
6.65301
8.09344
要使这种方法有效,您必须有一个实现场景检测的FFmpeg版本。另外,您必须为阈值选择一个合适的值(在第一个命令中是0.4
)。您可以尝试通过提取不同阈值的帧(然后手动检查帧)来找到最佳阈值,如下所示
ffmpeg -i input.flv \
-filter:v "select='gt(scene,0.1)',showinfo" \
-vsync 0 frames/%05d.jpg
为了澄清起见:grep [0-9.]*
不排除另一个答案中声称的整数。它匹配由数字和句点组成的任何字符序列,但也会匹配非数字,如'4.4.4‘。然而,ffmpeg不应该输出这样的格式错误的时间戳。
发布于 2018-12-28 13:01:45
您只需使用以下命令:
ffmpeg -i 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),以获得正确的输出
发布于 2016-11-24 14:53:33
我没有代表对上面的答案发表评论,但我想指出的是,@ckoehn和@keypulsations发布的grep只会获取时间戳,这是浮点数。要同时获取浮点和整数时间戳,请使用以下正则表达式
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps
https://stackoverflow.com/questions/35675529
复制相似问题