首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用FFMPEG:如何进行场景更改检测?用时间码?

使用FFMPEG:如何进行场景更改检测?用时间码?
EN

Stack Overflow用户
提问于 2016-02-27 21:15:14
回答 4查看 35.9K关注 0票数 31

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

现在,我有一个视频,显示一本书的文本,当文本(单词或句子)被说出来时,它会被高亮显示。就像这本有声书:https://youtu.be/lA7L6ZNVKjc

当文本被突出显示时,我需要知道时间戳(因此场景发生了变化),这将允许我在youtube视频中添加时间戳标记,这样听众就可以更容易地浏览有声读物。

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

非常感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-05 13:44:28

组合景物过滤器(用于检测场景更改)和展示信息过滤器应该可以实现您想要的结果:

代码语言:javascript
运行
复制
ffmpeg -i input.flv  \
       -filter:v "select='gt(scene,0.4)',showinfo" \
       -f null \
       - 2> ffout

此命令提取与前一帧不同的所有帧,其大小为(gt) 0.4 (从01)。对于这些帧,信息输出(showinfo)如下所示

代码语言:javascript
运行
复制
[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感兴趣。你可以这样做:

代码语言:javascript
运行
复制
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep [0-9.]* -o > timestamps

这将给出所有时间戳的列表:

代码语言:javascript
运行
复制
2.5372
4.37799
6.65301
8.09344

要使这种方法有效,您必须有一个实现场景检测的FFmpeg版本。另外,您必须为阈值选择一个合适的值(在第一个命令中是0.4)。您可以尝试通过提取不同阈值的帧(然后手动检查帧)来找到最佳阈值,如下所示

代码语言:javascript
运行
复制
ffmpeg -i input.flv \
       -filter:v "select='gt(scene,0.1)',showinfo" \
       -vsync 0 frames/%05d.jpg

为了澄清起见:grep [0-9.]*不排除另一个答案中声称的整数。它匹配由数字和句点组成的任何字符序列,但也会匹配非数字,如'4.4.4‘。然而,ffmpeg不应该输出这样的格式错误的时间戳。

票数 44
EN

Stack Overflow用户

发布于 2018-12-28 13:01:45

您只需使用以下命令:

代码语言:javascript
运行
复制
ffmpeg -i inputvideo.mp4 -filter_complex "select='gt(scene,0.3)',metadata=print:file=time.txt" -vsync vfr img%03d.png

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

代码语言:javascript
运行
复制
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),以获得正确的输出

票数 13
EN

Stack Overflow用户

发布于 2016-11-24 14:53:33

我没有代表对上面的答案发表评论,但我想指出的是,@ckoehn和@keypulsations发布的grep只会获取时间戳,这是浮点数。要同时获取浮点和整数时间戳,请使用以下正则表达式

代码语言:javascript
运行
复制
grep showinfo ffout | grep pts_time:[0-9.]* -o | grep -E '[0-9]+(?:\.[0-9]*)?' -o > timestamps
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35675529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档