python - 按播放时间停止视频
问题描述
我创建了一个程序来将视频提取到帧中。我需要建议在没有更多帧显示后停止 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'
解决方案
reading_video()
不使用return
所以它返回None
并且你有
instance_variable = None
然后
None.release()
在里面reading_video()
你应该使用
return read_input
或者甚至直接
read_input.release()
没有instance_variable.release()
推荐阅读
- javascript - React 组件中另一个文件中的 React JS 调用函数
- ios - 如何使异步请求Swift 5的for循环停止
- sql - T-SQL 窗口函数 - 计算间隙
- liquid - 如何删除由 Liquid 的`{% include ... %}` 添加的空格
- javascript - 在 Cypress 测试中等待最近的路由匹配
- python - 我的 while 函数没有返回任何值!我究竟做错了什么
- c# - 如何解释具有 0 个分支的最优或不可行解决方案?
- android - 为什么 livedata 从 Room 返回陈旧数据
- r - 为什么我不能从 begin.zip 文件加载数据
- node.js - 需要使用 JIRA REST API 和 NodeJS 从 JIRA 获取项目/问题