用python+opencv+PySimpleGUI实现了一款视频播放器

前言

本篇将用python实现一个mp4播放器,可以通过windows资源管理器选择需要播放的mp4视频文件或者图片,然后提供播放条的快进回放,播放和暂停功能:
在这里插入图片描述

准备工作

python所需要的库为PySimpleGUI、cv2和os:

import PySimpleGUI as sg
import cv2
import os

没有安装PySimpleGUI 和python-opencv库的,需要安装:

pip install PySimpleGUI 
pip install opencv-python

在这里插入图片描述
在这里插入图片描述

主要思路

主界面

通过PySimpleGUI快速构建播放器界面,PySimpleGUI是一个Python包,使所有级别的Python程序员能够创建GUI。您可以使用包含小部件的“布局”来指定GUI窗口(它们在PySimpleGUI中称为“元素”)。您的布局用于使用 4 个受支持的框架之一创建窗口,以显示窗口并与之交互。支持的框架包括tkinter,Qt,WxPython或Remi。术语“包装器”有时用于这些类型的包。你的 PySimpleGUI 代码比直接使用底层框架编写更简单、更短。
该库详细介绍见博文python机器人视觉编程——入门篇(下)
在这里插入图片描述
主界面布局代码:

# Create a window
layout = [
          [sg.Text('选择视频(mp4)或图像(png,jpg):'), sg.In(key='file'), sg.FileBrowse(file_types=(("Video Files", "*.mp4"), ("Image Files", "*.jpg;*.png")))],          
          [sg.Button('Play'), sg.Button('Pause'), sg.Button('Exit')],
          [sg.Image(filename='', key='image')],
          [sg.Slider((0, 100),0.0,0.01,orientation='h', size=(80, 15), key='slider')],
          ]

window = sg.Window('Media Player', layout, finalize=True)

视频读取

用opencv读取mp4视频信息,并读取逐帧图像,然后显示在主界面上。

#根据选择的路径打开视频
cap = cv2.VideoCapture(values['file'])
#获取视频的总长度
videocount=cap.get(cv2.CAP_PROP_FRAME_COUNT)
#依次读取图像
ret, frame = cap.read()

进度条拖拽

实现进度条拖拽,主要是需要将视频的长度换算到进度条的1-100的范围内,然后当进度条拖拽到任意个地方时,可以换算到视频的位置:

#获取视频总长度
videocount=cap.get(cv2.CAP_PROP_FRAME_COUNT)
#计算进度条每单元的视频长度
unite=videocount/100
#任意点播放时,获取进度条
progress=values['slider']       
#将进度条转化为视频当前位置,并设置     
cap.set(cv2.CAP_PROP_POS_FRAMES,progress*unite)  

效果如下:
在这里插入图片描述

源码

要在一个进度条显示进度并同时控制进度,需要借助一个内存变量实现,这个时本程序唯一个注意点,解决方法是判断两个变量的大小异同,然后动作:

if progress!=values['slider']:
                #print("slider")
                progress=values['slider']             
                cap.set(cv2.CAP_PROP_POS_FRAMES,progress*unite)             
                ret, frame = cap.read()
                if ret:
                    window['image'].update(data=cv2.imencode('.png', frame)[1].tobytes())
                    

完整源码已经上传:
源码资源链接

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-20 16:42:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-20 16:42:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-20 16:42:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-20 16:42:03       18 阅读

热门阅读

  1. html css背景图片透明文字不透明

    2023-12-20 16:42:03       36 阅读
  2. vuex--未完

    2023-12-20 16:42:03       49 阅读
  3. Web安全 - 深入同源策略

    2023-12-20 16:42:03       38 阅读
  4. 蓝底白字车牌的定位与字符分割识别 MATLAB 仿真

    2023-12-20 16:42:03       34 阅读
  5. [PTA]矩阵列平移

    2023-12-20 16:42:03       38 阅读
  6. 05-MySQL中的limit和union关键字

    2023-12-20 16:42:03       33 阅读
  7. 【libevent】IO引擎及实现

    2023-12-20 16:42:03       30 阅读
  8. springboot 解析微信小程序获取手机号

    2023-12-20 16:42:03       23 阅读
  9. 基于改进鲸鱼算法的最小乘支持向量机数据分类

    2023-12-20 16:42:03       29 阅读
  10. Python用Pygame实现一个五子棋小游戏

    2023-12-20 16:42:03       35 阅读
  11. iOS将framework转为xcframework

    2023-12-20 16:42:03       35 阅读
  12. Dubbo RPC-Redis协议

    2023-12-20 16:42:03       42 阅读
  13. Prolist组件实现动态竖排展示

    2023-12-20 16:42:03       33 阅读