使用OpenCV计算视频文件中的帧数?

4

我正在尝试计算我的视频文件('foo.h264')中的总帧数。

>>> import numpy as nm
>>> import cv2
>>> cap = cv2.VideoCapture('foo.h264')
>>> cap.get(CV_CAP_PROP_FRAME_COUNT)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'CV_CAP_PROP_FRAME_COUNT' is not defined
>>> cap.get(5)
25.0
>>> cap.get(7)
-192153584101141.0

因此,我认为get(5)提供的是帧率,而get(7)提供的是总帧数。显然,在上述情况下,get(7)是不正确的。因此,我尝试在一个.avi文件中查找这些值以进行验证。

>>> cap = cv2.VideoCapture('foo.avi')
>>> cap.get(5)
29.97002997002997
>>> cap.get(7)
256379.0

我可以通过将视频的持续时间乘以FPS来计算总帧数,但我不确定给定的.h264的FPS是否正确。为什么会出现负数的总帧数?这是一个错误吗?
附注:我使用树莓派摄像头录制了此视频文件(.h264)。

相关:https://dev59.com/ll8e5IYBdhLWcg3wyM7N(针对AVI容器) - Bonlenfum
3个回答

5

另一个解决方案是使用imageio,它对于一些视频有效。

import imageio
filename="person15_walking_d1_uncomp.avi"
vid = imageio.get_reader(filename,  'ffmpeg')
# number of frames in video
num_frames=vid._meta['nframes']

一个更加一致的解决方案是使用 meta_data = vid.get_meta_data(); num_frames = meta_data['nframes'] - codythecoder
当我尝试这样做时,结果num_framesinf。肯定是错的吧? - Rylan Schaeffer
持续时间为5.03,帧速率为30。我能否将这两个量相乘?可能不行,因为乘积不是整数。 - Rylan Schaeffer
num_frames = vid.count_frames() 对我有用。 - Akascape

1
事实证明,OpenCV不支持h.264格式(链接)。但是,Python OpenCV文档上有关于视频捕获的文档提到了一个整数参数。因此,在使用5和7代替'CV_CAP_PROP_FRAME_COUNT'时,您是正确的。您可以尝试将树莓派的捕获格式更改为avi。

是的,.h264只是NAL流,并不包含有关帧速率的信息。现在,当我将视频封装到像.mp4这样的容器中时,我可以计算出总帧数。但新视频的帧速率为25fps,这是错误的。但是从总帧数和持续时间中,我可以计算出真实的帧速率。 - Coderaemon

1
这对我有用(没有使用opencv):
import imageio

file="video.mp4" #the path of the video
vid=imageio.get_reader(file,  'ffmpeg')
totalframes = vid.count_frames()

print(totalframes)

它将返回总帧数 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接