使用openCV(使用2.4和3测试)和Python 2.7阅读AVI视频的整个持续时间时遇到了一些麻烦。视频的持续时间约为20分钟。
在一定数量的帧之后,我得到一个空帧和一个错误标志,意味着无法读取帧。我正在读取帧的方法是使用“CAP_PROP_POS_FRAMES”或“CAP_PROP_POS_MSEC”设置帧编号。 但是,当我与任何其他播放器(VLC,Windows Media Player)打开视频时,它会在整个持续时间内正常播放。
如上所述,openCV 2.4.11和3.0.0-rc1都会出现问题。
我进行了测试,在那里我读取帧直到上面发生,都使用时间和帧数设置帧。结果如下。
代码就在这里,
pathname = "C:\\videos"
# get all videofiles
videofiles = [file for file in os.listdir(os.path.join(pathname)) if file.endswith(".avi")]
nofalse = 0
v = 0
for vf in videofiles[1:]:
v += 1
# Test using frame number for seeking to frame
# Open video file
cap = cv2.VideoCapture(os.path.join(pathname, vf))
totalnoframes = cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
frange = np.arange(0, totalnoframes, 100)
for f in frange:
cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, f)
ret, frame = cap.read()
if ret is False:
break
# close video file
cap.release()
# Test using time for seeking to frame
# Open video file
cap = cv2.VideoCapture(os.path.join(pathname, vf))
totalnoframes = cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
totaldurationMS = 1000*totalnoframes/cap.get(cv2.cv.CV_CAP_PROP_FPS)
trange = np.linspace(0, totaldurationMS, totalnoframes)[::100]
for t in trange:
cap.set(cv2.cv.CV_CAP_PROP_POS_MSEC, t)
ret, frame = cap.read()
if ret is False:
break
cap.release()
# print results
vf = "Video %1.0f" % v
print "%s:\t%1.0f\t%1.2f\t%1.0f\t%1.2f" % (vf, t, t/np.float(totaldurationMS), f, f/np.float(totalnoframes))
结果就在这里。 第一个数字列是最后一个可读帧,以毫秒为单位,第二列显示使用时间读取的总帧数,第三列是最后读取的帧数,再次是读取帧的速率。
似乎上限帧数约为14000,并且没有总帧数较少的视频在读取帧时显示相同的限制。
有谁知道为什么会这样?我花了好几天试图解决这个问题,没有运气。非常感谢任何帮助!
谢谢!
视频1:940046 0.69 14100 0.69
视频2:980045 0.68 14700 0.68
视频3:973372 0.59 14600 0.59
视频4:940047 0.70 14100 0.70
视频5:953370 0.54 14300 0.54
视频6:940063 0.95 14100 0.95
视频7:506733 0.99 7600 0.99
视频8:1040047 0.70 15600 0.70
视频9:806733 1.00 12100 1.00
视频10:940056 0.85 14100 0.85
视频11:620066 0.99 9300 0.99
视频12:880066 0.99 13200 0.99
视频13:953371 0.56 14300 0.56
视频14:1026727 0.90 15400 0.90