【问题标题】:Why does OpenCV cap.get(cv2.CAP_PROP_POS_MSEC) only return 0?为什么 OpenCV cap.get(cv2.CAP_PROP_POS_MSEC) 只返回 0?
【发布时间】:2017-11-29 06:36:24
【问题描述】:

我最近按照教程在我的 Mac 上安装了 OpenCV for PYTHON: http://www.pyimagesearch.com/2016/12/19/install-opencv-3-on-macos-with-homebrew-the-easy-way/

我写了一个代码来读取一个视频文件,它能够检索 fps、timestamp、total no。帧数,在读取的每一帧:

cap = cv2.VideoCapture(particle_name + video_file_type)

while True:
    time = cap.get(cv2.CAP_PROP_POS_MSEC)
    fps = cap.get(cv2.CAP_PROP_FPS)
    total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)

    print(time, fps, total_frames)

    ret, frame = cap.read()
    cv2.imshow('frame', frame)

cap.release()
cv2.destroyAllWindows()

我在 Video A、.mov 格式、Motion JPEG Video (dmb1) 编解码器上试用了此代码。 和 Video B,.avi 格式,Motion JPEG Video (MJPG) 编解码器。

对于视频 A 和视频 B,输出的 fps 和 total_frames 都是常数。然而,对于视频 A,时间逐渐增加(应该如此),但对于视频 B,时间保持不变,为 0。

我认为这可能是导致这种差异的视频格式,因此我将视频 B 的格式更改为 .mov,同时保留相同的编解码器,但问题仍然存在。

我可以知道如何从视频 B 中检索准确的时间戳吗?

【问题讨论】:

    标签: python opencv video


    【解决方案1】:

    我不确定为什么 cap.get(cv2.CAP_PROP_FRAME_COUNT) 没有返回正确的时间戳。这可能是编解码器问题。 Yoo 可以尝试其他编解码器,如 XVID、MP4V 等。请注意,扩展名仅表示文件的容器,更改可能不会真正导致视频文件发生任何有意义的更改。

    如果仍然无法正常工作,请使用帧数和图像的 FPS 来获取时间戳。

    fps = cap.get(cv2.CV_CAP_PROP_FPS)
    frame_count = 0
    while True:
       frame_count++
       time = float(frame_count)/fps
    

    编辑: 您可以使用 ffmpeg 更改编解码器。这是 Mac 的示例教程https://www.macxdvd.com/mac-dvd-video-converter-how-to/ffmpeg-avi-to-mp4-free.htm

    【讨论】:

      猜你喜欢
      • 2022-01-28
      • 2021-03-19
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 2015-06-21
      • 2019-12-26
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多