我正在尝试读取、进行一些处理,然后使用 Python 中的 OpenCV 保存
.mp4
视频,但是 cap.get(cv2.CAP_PROP_FPS)
为某些视频返回错误的 FPS。
所以我不会详细介绍代码的作用,因为它与当前的问题无关。我注意到我的程序的输出视频播放速度太快,在调试时我决定只看看它在播放输入视频时的样子。
所以播放代码看起来像这样:
cap = cv2.VideoCapture(video_path)
video_fps = cap.get(cv2.CAP_PROP_FPS)
#returns 49.8
while cap.isOpened():
ret, frame = cap.read()
if ret:
cv2.imshow('a', frame)
cv2.waitkey(int(1000/video_fps))
else:
break
但是视频播放速度太快,所以我右键单击 -> 属性 -> 详细信息,果然上面写着
frames per seconds: 49
...但我知道我的大多数视频都是 25 fps(大约是 49.8 的一半),所以出于好奇,我将延迟更改为两倍:cv2.waitkey(int(2000/video_fps))
突然,视频以完美的速度播放。
另一个奇怪的是,当我将
cap.get(cv2.CAP_PROP_POS_FRAMES)
的结果除以以秒为单位的视频长度时,我再次得到 49.8,因为我知道长度必须是正确的,所以我只能猜测 OpenCV 得到的帧数是错误的(?)
所以我的问题是:
1)这到底是怎么回事?
2)是否有更好\更可靠的方法来检查视频 fps 和帧数?
我知道这个帖子已经很旧了,但是人们仍然遇到这个问题,这似乎是一个持续存在的问题:https://github.com/opencv/opencv/issues/16821。我在
.mp4
上遇到了同样的问题,为我解决的方法是导出到 .mov
。不知道为什么 .mp4
有问题,但似乎是 github 问题中的常见趋势
我有同样的问题,我通过修复Python中视频的呈现时间戳来修复它,你必须安装ffmpeg才能运行下面的命令,这里是命令:
ffmpeg_command = [
'ffmpeg',
'-fflags', '+genpts', # Fix presentation timestamps
'-i', renamed_path,
'-c:v', 'copy', # Copy the video stream without re-encoding
'-ignore_unknown', # Ignore unknown streams or errors
'-y', # Overwrite the output file if it exists
output_path
]
subprocess.run(ffmpeg_command, check=True)