FFMPEG:获取所有帧的场景变化检测值

时间:2016-11-19 00:52:42

标签: video ffmpeg

我正在尝试测量电影的“快速”程度(屏幕中的动作更多,快速的场景机会)。我不希望电影只有一个值,而是要看电影中的值以查看动作在其中的变化情况。规范化电影的帧速率(10 fps)后,我的想法是将每个帧与前一帧进行比较。如果场景发生变化,我不仅对此感兴趣,而且如果没有切割,那么我有多少动作。不仅人/物体运动,而且相机运动。总结一下场景中的节奏(我认为是这个术语)。

我的想法是使用ffmpeg中的scene函数作为指标。但是看documentexamples online我认为我只能使用场景变化检测的值作为返回帧信息的阈值,但我不能让ffmpeg返回值。是对的吗?有什么方法可以让它返回值?

2 个答案:

答案 0 :(得分:5)

使用

ffmpeg -i in.mp4 -vf select='gte(scene,0)',metadata=print:file=scenescores.txt -an -f null -

创建的文本文件将具有如下输出:

...
frame:1440 pts:737280  pts_time:48     
lavfi.scene_score=0.003069
frame:1441 pts:737792  pts_time:48.0333
lavfi.scene_score=0.001593
frame:1442 pts:738304  pts_time:48.0667
lavfi.scene_score=0.000077
frame:1443 pts:738816  pts_time:48.1   
lavfi.scene_score=0.002219
...

答案 1 :(得分:1)

我发现很难解析ffmpeg输出,因此我创建了a wrapper in Python

pip3 install scenecut_extractor

默认情况下,它将基于阈值提取场景剪辑,因此将为您提供参数上方的所有内容:

$ scenecut_extractor /path/to/file.mp4

默认情况下将输出JSON:

[
  {
    "frame": 114,
    "pts": 114.0,
    "pts_time": 3.8,
    "score": 0.445904
  },
  {
    "frame": 159,
    "pts": 159.0,
    "pts_time": 5.3,
    "score": 0.440126
  }
]

您可以设置-t 0提取所有内容。检查-h了解更多选项。