102人参与 • 2025-03-08 • Python
提到opencv,大家首先想到的可能是图像处理、目标检测,但你是否想过——用opencv实现一个带进度条、倍速播放、暂停功能的视频播放器?本文将通过一个实战项目,带你深入掌握opencv的视频处理能力,并解锁以下功能:
文末提供完整代码,可直接运行!
安装opencv
pip install opencv-python # python版本
准备测试视频
准备一个mp4或avi格式的视频文件(示例代码路径为/home/user/video.mp4,读者自行替换)。
import cv2
cap = cv2.videocapture('video.mp4')
while cap.isopened():
ret, frame = cap.read()
if not ret:
break
cv2.imshow('player', frame)
if cv2.waitkey(25) == 27: # 按esc退出
break
cap.release()
cv2.destroyallwindows()
代码解析
videocapture:支持文件、摄像头、网络流多种输入源。
waitkey(25):控制播放速度(25ms对应约40 fps)。
通过调整waitkey的延迟时间实现变速:
self.speed = 1.0 # 初始速度 key = cv2.waitkey(max(1, int(25 / self.speed))) # 确保延迟≥1ms
按+加速,按-减速,速度范围限制在0.5x~4x。
利用opencv的滑动条控件实现交互:
#创建进度条
cv2.createtrackbar('progress', 'player', 0, total_frames, self.on_trackbar)
#回调函数
def on_trackbar(self, pos):
self.cap.set(cv2.cap_prop_pos_frames, pos) # 跳转到指定帧
在视频帧上绘制进度条和时间戳:
def draw_overlay(self, frame):
# 计算进度条长度
progress_width = int(frame.shape * (self.current_frame / self.total_frames))
cv2.rectangle(frame, (0, 10), (progress_width, 30), (0, 255, 0), -1)
# 显示时间
cv2.puttext(frame, f"time: {self.current_frame/self.fps:.2f}s", (10, 60), cv2.font_hershey_simplex, 0.7, (0, 255, 0), 2)
import cv2
class videoplayer:
def __init__(self, video_path):
self.cap = cv2.videocapture(video_path)
if not self.cap.isopened():
raise valueerror("无法打开视频文件,请检查路径或格式")
# 获取视频属性
self.total_frames = int(self.cap.get(cv2.cap_prop_frame_count))
if self.total_frames <= 0:
raise valueerror("视频总帧数无效,请检查文件格式")
self.fps = self.cap.get(cv2.cap_prop_fps)
self.delay = int(1000 / self.fps) # 默认帧延迟(毫秒)
# 初始化播放控制变量
self.pause = false
self.current_frame = 0
self.speed = 1.0 # 播放速度倍数
# 创建窗口和进度条
cv2.namedwindow('opencv video player')
cv2.createtrackbar('progress', 'opencv video player', 0, self.total_frames, self.on_trackbar)
def on_trackbar(self, pos):
"""进度条回调函数"""
self.current_frame = pos
self.cap.set(cv2.cap_prop_pos_frames, pos)
def run(self):
while true:
if not self.pause:
ret, frame = self.cap.read()
if not ret:
# 视频结束,重置到开头循环播放
self.cap.set(cv2.cap_prop_pos_frames, 0)
self.current_frame = 0
continue
self.current_frame += 1
# 更新进度条位置(避免递归调用)
cv2.settrackbarpos('progress', 'opencv video player', self.current_frame)
# 在帧上绘制进度条和时间戳
self.draw_overlay(frame)
cv2.imshow('opencv video player', frame)
# 处理键盘事件(确保延迟不低于1ms)
key = cv2.waitkey(max(1, int(self.delay / self.speed)))
if key == 27: # esc退出
break
elif key == 32: # 空格键暂停/继续
self.pause = not self.pause
elif key == ord('+'): # 加速
self.speed = min(4.0, self.speed + 0.5)
print(f"加速至 {self.speed}x")
elif key == ord('-'): # 减速
self.speed = max(0.5, self.speed - 0.5)
print(f"减速至 {self.speed}x")
self.cap.release()
cv2.destroyallwindows()
def draw_overlay(self, frame):
"""绘制进度条、时间和速度信息"""
# 进度条:基于视频宽度计算
video_width = frame.shape[1]
progress_ratio = self.current_frame / self.total_frames
progress_width = int(video_width * progress_ratio)
cv2.rectangle(frame, (0, 10), (progress_width, 30), (0, 255, 0), -1)
# 时间戳
current_time = self.current_frame / self.fps
time_text = f"time: {current_time:.2f}s"
cv2.puttext(frame, time_text, (10, 60), cv2.font_hershey_simplex, 0.7, (0, 255, 0), 2)
# 播放速度
speed_text = f"speed: {self.speed:.1f}x"
cv2.puttext(frame, speed_text, (10, 100), cv2.font_hershey_simplex, 0.7, (0, 255, 0), 2)
if __name__ == "__main__":
player = videoplayer('/home/videos/movie/1.mp4') # 替换为你的视频路径
player.run()
到此这篇关于python+opencv开发一个视频播放器的文章就介绍到这了,更多相关python opencv视频播放内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论