欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > 用OpenCV写个视频播放器可还行?(Python版)

用OpenCV写个视频播放器可还行?(Python版)

2025/5/16 15:15:55 来源:https://blog.csdn.net/lincyang/article/details/146028277  浏览:    关键词:用OpenCV写个视频播放器可还行?(Python版)

引言

提到OpenCV,大家首先想到的可能是图像处理、目标检测,但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器?本文将通过一个实战项目,带你深入掌握OpenCV的视频处理能力,并解锁以下功能:

  • 基础播放/暂停
  • 动态倍速调节(0.5x~4x)
  • 交互式进度条
  • 实时时间戳显示

文末提供完整代码,可直接运行!

一、环境准备

安装OpenCV

pip install opencv-python  # Python版本

准备测试视频

准备一个MP4或AVI格式的视频文件(示例代码路径为/home/user/video.mp4,读者自行替换)。

二、核心功能实现

1. 基础播放器

import cv2cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():ret, frame = cap.read()if not ret:breakcv2.imshow('Player', frame)if cv2.waitKey(25) == 27:  # 按ESC退出break
cap.release()
cv2.destroyAllWindows()

代码解析

  • VideoCapture:支持文件、摄像头、网络流多种输入源。
  • waitKey(25):控制播放速度(25ms对应约40 FPS)。

三、功能扩展:让播放器更强大

1. 倍速播放

通过调整waitKey的延迟时间实现变速:

self.speed = 1.0  # 初始速度
key = cv2.waitKey(max(1, int(25 / self.speed)))  # 确保延迟≥1ms

按+加速,按-减速,速度范围限制在0.5x~4x。

2. 进度条与跳转

利用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)  # 跳转到指定帧

3. 实时信息叠加

在视频帧上绘制进度条和时间戳:

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 cv2class 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 = Falseself.current_frame = 0self.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 = posself.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 = 0continueself.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退出breakelif key == 32:  # 空格键暂停/继续self.pause = not self.pauseelif 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_framesprogress_width = int(video_width * progress_ratio)cv2.rectangle(frame, (0, 10), (progress_width, 30), (0, 255, 0), -1)# 时间戳current_time = self.current_frame / self.fpstime_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()

五、后记

灵感来自《学习OpenCV3》,第二章介绍了如何用Opencv C++代码显示(播放)视频。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词