OpenCV 给出的视频 FPS 和帧数不正确

问题描述 投票:0回答:2

我正在尝试读取、进行一些处理,然后使用 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 和帧数?

python opencv video mp4
2个回答
2
投票

我知道这个帖子已经很旧了,但是人们仍然遇到这个问题,这似乎是一个持续存在的问题:https://github.com/opencv/opencv/issues/16821。我在

.mp4
上遇到了同样的问题,为我解决的方法是导出到
.mov
。不知道为什么
.mp4
有问题,但似乎是 github 问题中的常见趋势


0
投票

我有同样的问题,我通过修复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)
© www.soinside.com 2019 - 2024. All rights reserved.