【问题标题】:Stop video by its play time按播放时间停止视频
【发布时间】:2020-04-27 18:10:08
【问题描述】:

我创建了一个程序来将视频提取到帧中。我需要建议在没有更多帧显示后停止 cv2.imshow()。

视频帧数 = 88

fps = 10.0

持续时间= int(8)


    def reading_video():
        read_input = cv2.VideoCapture(r"D:\data\input.mp4")
        frame_rate = int(read_input.get(cv2.CAP_PROP_FRAME_COUNT)) # 88
        print("total number of frames is ", frame_rate)
        fps = read_input.get(cv2.CAP_PROP_FPS) #10.0
        duration = int((frame_rate/fps) %60)# 8
        print(duration) # 8.0

        initial_frame = 0
        while read_input.isOpened():
            ret, frame = read_input.read()
            if ret == True:
                cv2.imshow('video_frame', frame)
                write_path = r"D:\data\frame_output"
                write_name = 'frame0' + str(initial_frame) + '.jpg'
                cv2.imwrite(os.path.join(write_path, write_name), frame)
                initial_frame += 1
                if cv2.waitKey(0) & 0xFF == ord('c'):
                    break
            else:
                break


    instance_variable = reading_video()
    instance_variable.release()
    cv2.destroyAllWindows()

如果 waitkey(int(duration)) 则播放,并且在无帧后我确实收到 cv2 断言错误。

如果 waitkey(0) 那么我得到 AttributeError: 'NoneType' object has no attribute 'release'

【问题讨论】:

  • 你为什么在instance_variable上使用release()reading_video() 不使用return 所以它返回None 所以你有instance_variable = None 和后来的None.release()

标签: python opencv


【解决方案1】:

reading_video() 不使用return 所以它返回None 并且你有

instance_variable = None

以后

None.release()

reading_video() 内你应该使用

return read_input

甚至可以直接

read_input.release() 

没有instance_variable.release()

【讨论】:

  • 感谢@furas 的帮助,在了解了 release() 方法的用途后,我确实删除了它,现在它的持续时间可以正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多