目标:
通过拖动进度条,实现视频播放进度的调整
实现效果:
代码实现:
class PlayWithProgresBar(threading.Thread):
"""视频与进度条同步"""
def __init__(self, str_rtsp):
super().__init__()
# 视频路径
self.str_rtsp = str_rtsp
self.trackbarName = 'cap video'
self.windowName = 'cap video'
# 当前帧
self.n_currentframe = 0
# 通过cv2中的类获取视频流操作对象cap
self.cap = cv2.VideoCapture(self.str_rtsp)
# 调用cv2方法获取cap的视频帧(帧:每秒多少张图片)
self.fps = self.cap.get(cv2.CAP_PROP_FPS)
# 获取总帧数
self.totalFrame = self.cap.get(cv2.CAP_PROP_FRAME_COUNT)
# 帧间隔
self.pauseTime = int(1000 / self.fps)
# 定义编码格式mpge-4
self.fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')
cv2.namedWindow("cap video", 0)
def track_bar_func(self, trackbarValue):
# 视频定位到指定的帧
self.cap.set(cv2.CAP_PROP_POS_FRAMES, trackbarValue)
# 进度条同步
cv2.setTrackbarPos(self.trackbarName, self.windowName, trackbarValue)
self.n_currentframe = trackbarValue
def run(self):
ret, image = self.cap.read()
n_currentframe = 0
# 创建进度条
cv2.createTrackbar(self.trackbarName, self.windowName, n_currentframe, int(self.totalFrame), self.track_bar_func)
while ret:
cv2.imshow('cap video', image)
cv2.waitKey(self.pauseTime)
# 更新进度条状态
cv2.setTrackbarPos(self.trackbarName, self.windowName, self.n_currentframe)
self.n_currentframe += 1
ret,image = self.cap.read()
if cv2.getWindowProperty('cap video', cv2.WINDOW_AUTOSIZE) or cv2.waitKey(self.pauseTime) & 0xFF == ord('q'):
break
self.cap.release()
cv2.destroyAllWindows()
rtsp_str = r'D:\work\boradxt\note\drsu3-03221137.avi'
playback = PlayWithProgresBar(rtsp_str)
playback.start()
关键代码说明:
cv2.getWindowProperty('cap video', cv2.WINDOW_AUTOSIZE)
获得窗口cap video的 cv2.WINDOW_AUTOSIZE属性,窗口不存在时返回-1。
cv2.waitKey(self.pauseTime) & 0xFF == ord('q'):
判断键盘输入为q
。
getWindowProperty获取窗口的属性,第一个参数是窗口的名称,第二个参数是具体的窗口属性。
cv2.createTrackbar(self.trackbarName, self.windowName, n_currentframe, int(self.totalFrame), self.track_bar_func)
创建进度条,第一个参数是进度条名称,第二个是绑定的窗口名称,第三个参数是进度条初始位置,第四个是进度条最大值,最后一个参数是进度条回调方法(改变进度条后的响应操作)。