使用FFMPEG提取帧?

时间:2016-02-28 20:40:38

标签: python opencv video ffmpeg frame

我尝试编写代码,使用ffmpeg(或openCV - 对建议开放)和python从视频文件中提取16帧,但我在如何开始时遇到了很多麻烦。
我可以直接在python中使用ffmpeg命令行吗?如果是,是否有命令来获取剪辑的长度和帧速率?如何以相等的间隔拉帧?

任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:0)

我可以使用ffprobe获取元数据信息,包含在ffmpeg中。

模块子流程是一种在python之外使用工具并返回退出状态或检查输出的方法,如下例所示。然后你可以将python变量分配给ffprobe的解析输出。 使用shell = True存在安全问题。这至少可以让你开始,你可以想办法避免以后使用它。

template <typename Char, typename Traits, typename T>
std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& is, std::vector<T>& v)
{
    std::size_t s;
    if (!(is >> s))
        return is;
    v.resize(s);
    for (auto& i : v)
    {
        is >> i;
    }
    return is;
}

将返回:

import subprocess

dur_check = subprocess.check_output('ffprobe -v error -show_format We\ Code\ Hard.mp4 | grep duration')
duration = dur_check.split('=')[1]

然后,fps有点不同。

'192.631667'

返回:

fps_check = subprocess.check_output('ffprobe We\ Code\ Hard.mp4 2>&1 | grep fps',shell=True)
fps = fps_check.split(' ')[4].strip()

答案 1 :(得分:0)

  

我可以直接在python中使用ffmpeg命令行吗?

是。我没有使用Python的经验,但tink3r's answer对我来说就是一个例子。

  

如果是,是否有命令来获取剪辑和帧速率的长度?

是。使用ffprobe

$ ffprobe -v error -select_streams v:0 -show_entries stream=duration,avg_frame_rate -of default=nw=1:nk=0 input.mp4
avg_frame_rate=24/1
duration=888.000000
  • 此示例仅从第一个视频流中获取所需信息;否则它还会显示音频等条目

  • 如示例所示,不需要其他流程,例如grepsedawk或类似的任何流程。

  • 如果您要删除avg_frame_rate=duration=键,请将nk=0更改为nk=1

  • Python人喜欢JSON格式,对吧?如果是这种情况,那么您可以将-of default=nw=1:nk=0更改为-of json

  • 有关更多示例,请参阅FFmpeg Wiki: FFprobe Tips

  

如何以相等的间隔拉帧?

您可以使用select filter。每十秒选择一帧的示例:

ffmpeg -i -vf "select='not(mod(t\,10))'" -vsync vfr output_%03d.png

这会产生output_001.pngoutput_002.pngoutput_003.png等。