Python 使用FFMPEG提取帧?

Python 使用FFMPEG提取帧?,python,opencv,video,ffmpeg,frame,Python,Opencv,Video,Ffmpeg,Frame,我正试图使用ffmpeg(或openCV-open to suggestions)和python编写代码,从视频文件中提取16帧,但我在想如何开始时遇到了很多困难。 我可以直接在python中使用ffmpeg命令行吗?如果有,是否有命令获取剪辑长度和帧速率?如何以相等的间隔拉动框架 任何帮助都将不胜感激!谢谢大家! 我可以使用ffmpeg附带的ffprobe获取元数据信息 模块子流程是一种在python之外使用工具并返回退出状态或检查输出的方法,如下面的示例所示。然后可以将python变量分配给

我正试图使用ffmpeg(或openCV-open to suggestions)和python编写代码,从视频文件中提取16帧,但我在想如何开始时遇到了很多困难。
我可以直接在python中使用ffmpeg命令行吗?如果有,是否有命令获取剪辑长度和帧速率?如何以相等的间隔拉动框架


任何帮助都将不胜感激!谢谢大家!

我可以使用ffmpeg附带的ffprobe获取元数据信息

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

import subprocess

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

'192.631667'
然后,fps有点不同

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

'29.97 fps'

我可以使用ffmpeg附带的ffprobe获取元数据信息

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

import subprocess

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

'192.631667'
然后,fps有点不同

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

'29.97 fps'
我可以直接在python中使用ffmpeg命令行吗? 对。我没有Python方面的经验,但在我看来,它就像一个例子

如果有,是否有命令获取剪辑长度和帧速率? 对。使用
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
  • 该示例将仅从第一个视频流获取所需信息;否则,它还将显示音频等的条目

  • 如示例所示,不需要额外的过程,例如
    grep
    sed
    awk
    或类似的过程

  • 如果要删除
    avg\u frame\u rate=
    duration=
    键,请将
    nk=0
    更改为
    nk=1

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

  • 有关更多示例,请参见

如何以相等的间隔拉动框架? 您可以使用。每10秒选择一帧的示例:

ffmpeg -i -vf "select='not(mod(t\,10))'" -vsync vfr output_%03d.png
这将导致
输出\u 001.png
输出\u 002.png
输出\u 003.png
,等等

我可以直接在python中使用ffmpeg命令行吗? 对。我没有Python方面的经验,但在我看来,它就像一个例子

如果有,是否有命令获取剪辑长度和帧速率? 对。使用
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
  • 该示例将仅从第一个视频流获取所需信息;否则,它还将显示音频等的条目

  • 如示例所示,不需要额外的过程,例如
    grep
    sed
    awk
    或类似的过程

  • 如果要删除
    avg\u frame\u rate=
    duration=
    键,请将
    nk=0
    更改为
    nk=1

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

  • 有关更多示例,请参见

如何以相等的间隔拉动框架? 您可以使用。每10秒选择一帧的示例:

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

这将导致
output\u 001.png
output\u 002.png
output\u 003.png
,等等。

谢谢!我在想类似的事情。。例如,我必须遵循我希望在循环中执行的命令行:“cmdline=“ffmpeg-I”+file+”-ss 00:00:%d-vframes 1 BPout%d.png“(frametimestamps[I],I)”我可以类似地调用“subprocess.check_output(cmdline)”来输出帧吗?您可以使用“check_output”或“call”。呼叫将返回退出状态以确定是否成功。谢谢!我在想类似的事情。。例如,我必须遵循我希望在循环中执行的命令行:“cmdline=“ffmpeg-I”+file+”-ss 00:00:%d-vframes 1 BPout%d.png“(frametimestamps[I],I)”我可以类似地调用“subprocess.check_output(cmdline)”来输出帧吗?您可以使用“check_output”或“call”。呼叫将返回退出状态以确定是否成功。非常感谢您的帮助!设法把一切都弄明白了!:)非常感谢您的回复!设法把一切都弄明白了!:)