根据本文,似乎可以使用FFMPEG来检测视频中的场景变化:
http://www.luckydinosaur.com/u/ffmpeg-scene-change-detector

现在,我有一个显示书本文字的视频,当说出文字(单词或句子)时,它会突出显示。
像这样的有声读物:https://youtu.be/lA7L6ZNVKjc

我需要知道文本突出显示时的时间戳记(从而更改场景),这将允许我在youtube视频上添加时间戳记标签,以便听众更容易地浏览有声读物。

什么是神奇的命令行可以做到这一点?

非常感谢你!

最佳答案

结合使用scene过滤器(用于检测场景变化)和showinfo过滤器,可以实现所需的功能:

ffmpeg -i input.flv  \
       -filter:v "select='gt(scene,0.4)',showinfo" \
       -f null \
       - 2> ffout

此命令提取与前一帧相差超过(gt)0.4(从01的比例)的所有帧。对于这些框架,像这样打印出信息(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不应输出格式错误的时间戳。

关于video - 使用FFMPEG:如何进行场景变化检测?与时间码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35675529/

10-16 18:03
查看更多