我尝试编写代码,使用ffmpeg(或openCV - 对建议开放)和python从视频文件中提取16帧,但我在如何开始时遇到了很多麻烦。
我可以直接在python中使用ffmpeg命令行吗?如果是,是否有命令来获取剪辑的长度和帧速率?如何以相等的间隔拉帧?
任何帮助将不胜感激!谢谢!
答案 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
此示例仅从第一个视频流中获取所需信息;否则它还会显示音频等条目
如示例所示,不需要其他流程,例如grep
,sed
,awk
或类似的任何流程。
如果您要删除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.png
,output_002.png
,output_003.png
等。