python3GUI--qt仿暴风影音视频播放器By:PyQt5(附下载地址)

文章目录

  • 一.前言
  • 二.环境
    • 1.开发环境
    • 2.打包环境
    • 3.运行环境
  • 三.软件截图
    • 1.启动页
    • 2.视频播放
    • 3.音频播放
    • 4.其他
      • 1.托盘
      • 2.对话框
  • 四.功能总览
  • 五.代码展示&心得
    • 1.UI设计
    • 2.如何防止卡顿
    • 3.如何自定义组件
  • 五.思考
    • 1.解码器
    • 2.播放列表
  • 六.总结


一.前言

前面做过一款python3GUI–做一款弹幕视频播放器(第二弹v1.5)By:PyQt5(附下载地址),仿作了一款支持播放在线、本地音乐、视频的多功能播放器,本次仍然使用PyQt5制作一款音视频播放器、UI风格参考了暴风影音,下面我将详细介绍一下我开发的这款“风暴影音”播放器。放个图比较一下。
在这里插入图片描述

二.环境

1.开发环境

本次开发是在window11上使用pycharm开发工具开发的,详细开发环境如下:

  1. 系统:Windows 11 家庭中文版
  2. 处理器:AMD Ryzen 7 7735H with Radeon Graphics 3.20 GHz
  3. 开发工具:PyCharm 2021.3
  4. Python版本:Python3.8
  5. PyQt版本:PyQt5 5.15.9
  6. pip版本:pip 24.0

2.打包环境

nuitka打包,版本:2.0.5
详细参数见下图
在这里插入图片描述

3.运行环境

对于已打包好的exe文件,需要安装对应版本的解码器才能正常使用本播放器,解码器下载地址放在了下面:

https://wwt.lanzoul.com/ickJ81rkm50b

大家下载安装好解码器后再打开本播放器,即可正常使用播放器。

三.软件截图

1.启动页

启动页是我们打开软件后看到的第一个页面,它大致展示了软件的基本功能,
主界面分为四个区域,最顶端为标题区域,中间左边为主播放区域,内部包含欢迎页面、视频页面、音频页面,中间右侧为播放列表区域,最下方为播放控制区域。
在这里插入图片描述

2.视频播放

通过在主界面或播放列表的+号添加本地视频文件到播放列表,选择播放视频文件,本播放器支持多种视频格式,包括不限于"mp4", “rmbv”, “mkv”, “3gp”, “m3u8”, “avi”, “m4v”, “ts”, “flv”, “m4s”。
在这里插入图片描述

3.音频播放

添加方式和添加视频类似,支持的播放的音频类别包括不限于"mp3", “m4a”, “aac”, “flac”,在播放列表项目右击展示右击菜单,右击菜单包括对单文件的操作和对播放列表的操作。
在这里插入图片描述

4.其他

1.托盘

本次自定义了托盘的样式,托盘的逻辑目前只有“退出”能够响应,其他操作均为跳转到笔者博客主页。
请添加图片描述

2.对话框

本次自定义了对话框的样式,这样可以使得我们的整体UI风格比较统一,对话框之间通过使用继承的方式实现不同的效果,提高了代码复用。

信息对话框
请添加图片描述
询问对话框
请添加图片描述
输入对话框

请添加图片描述

四.功能总览

博文不如视频说的清楚、明白,遂备一张思维导图以详细展示本软件所有功能。

在这里插入图片描述

五.代码展示&心得

每次做新的项目都会有点收货,在此模块记录下自己的心得体会,和大家分享一下代码思路。

1.UI设计

本次采用组件化思想,对整个项目进行拆分,按照UI布局整体拆分成了4个部分,对每一部分的组件继续拆分,直到无法再分,拆分到单个组件的最小单位。本次UI设计并没有使用Designer进行布局,使得本次项目UI设计比较抽象,但是如果自己心里清楚每一部分的话,就有一个整体全局观。
在下图的代码中,我们能看到主界面被分成了四个部分,整体采用垂直布局,内部采用一个QSplitter将主播放区域和播放列表区域水平分开,这样设计的好处是:用户可以自行手动调节中间区域的大小,给予用户较大的灵活性。

在这里插入图片描述

2.如何防止卡顿

软件使用过程中卡顿是用户不能容忍的,当UI卡顿时,用户会感觉到程序响应缓慢,操作不流畅。长时间等待和界面无响应会让用户感到不耐烦,降低对程序的满意度。
本次采用多线程的方式处理耗时操作,本软件的耗时操作主要是读取本地文件的基本信息,我们可以把这个耗时操作放到子线程中,当读取完后,使用发射信号的方式把数据发射到主程序中,最后使用槽函数接收信号,处理数据。
上面的思路体现到代码中就是:通过继承QThread的方式来处理耗时操作,具体使用方法见下图:

在这里插入图片描述
下面也有一些能够解决PyQt5 UI卡顿的思路,大家可以尝试

  1. 优化代码逻辑:检查程序中是否存在长时间运行的操作或大量计算,尝试将这些操作放在单独的线程中执行,以避免阻塞主线程。
  2. 使用合适的布局和控件:选择适合程序需求的布局和控件,避免使用过于复杂或不必要的布局和控件,以减少渲染和计算负担。
  3. 减少界面元素:适当减少界面上的元素数量,特别是动态加载的元素,以降低界面渲染的复杂度。
  4. 使用缓存和异步加载:对于需要频繁加载的数据或图片等资源,可以使用缓存和异步加载技术,提高加载速度和效率。
  5. 升级硬件和软件:如果程序对硬件要求较高,可以考虑升级计算机硬件。同时,保持PyQt5和相关依赖库的版本更新,以利用最新的性能优化和修复。

3.如何自定义组件

这个问题比较基础,在此说下我的思路,就拿下面音量调节组件来说,它的基类是一个横向的QSlider,通过重写鼠标事件来控制展示的样式。
请添加图片描述
相关代码如下

import sysfrom PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QSliderclass NormalHorizontalSlider(QSlider):"""通用水平进度条"""def __init__(self, p=None):super(NormalHorizontalSlider, self).__init__(p)self.setOrientation(Qt.Horizontal)self.setMinimum(0)class VolumeSlider(NormalHorizontalSlider):"""音量调节slider"""horizontal_scrollBar_normal_style = """ QSlider::groove:horizontal {border: 1px solid rgb(50,50,50);background: rgb(50,50,50);height:4px;border-radius: 1px;padding-left:-1px;padding-right:-1px;padding-top:-2px;padding-bottom:-2px;}QSlider::handle:hover{width: 5px;height: 5px;}QSlider::sub-page:horizontal {background: rgb(27,157,255);border: 1px solid rgb(27,157,255);height: 10px;border-radius: 1px;}QSlider::handle:horizontal{background: #09a1ff;border: 0px solid #09a1ff;width: 0px;height: 0px;margin-top: 0px;margin-bottom: 0px;border-radius: 6px;}"""horizontal_scrollBar_style = """ QSlider::groove:horizontal {
border: 1px solid rgb(50,50,50);
background: rgb(50,50,50);
height:4px;
border-radius: 1px;
padding-left:-1px;
padding-right:-1px;
padding-top:-2px;
padding-bottom:-2px;
}QSlider::handle:hover{width: 5px;
height: 5px;
}QSlider::sub-page:horizontal {
background: rgb(27,157,255);
border: 1px solid rgb(27,157,255);
height: 10px;
border-radius: 1px;
}QSlider::handle:horizontal
{background: #09a1ff;border: 1px solid #09a1ff;width: 10px;height: 10px;margin-top: -4px;margin-bottom: -4px;border-radius: 6px;
}"""def __init__(self, p=None):super(VolumeSlider, self).__init__(p)self.setSingleStep(5)self.setFixedWidth(70)self.setMaximum(100)self.setValue(100)self.setCursor(Qt.PointingHandCursor)self.setStyleSheet(self.horizontal_scrollBar_normal_style)def enterEvent(self, a0: QtCore.QEvent) -> None:self.setStyleSheet(self.horizontal_scrollBar_style)super(VolumeSlider, self).enterEvent(a0)def leaveEvent(self, a0: QtCore.QEvent) -> None:self.setStyleSheet(self.horizontal_scrollBar_normal_style)super(VolumeSlider, self).leaveEvent(a0)if __name__ == '__main__':QApplication.setHighDpiScaleFactorRoundingPolicy(Qt.HighDpiScaleFactorRoundingPolicy.PassThrough)QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)app = QApplication(sys.argv)app.setAttribute(Qt.AA_DontCreateNativeWidgetSiblings)win = VolumeSlider()win.show()sys.exit(app.exec_())

五.思考

1.解码器

如果遇到了DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x80004005 (δ???),90%是因为没有安装或正确安装解码器。
大家在使用本软件之前切记要下载对应的解码器,以保证视频的正常播放。

2.播放列表

本次播放列表的实现是通过QMediaPlayer+QMediaPlaylist的方式实现的,但是写到播放列表“删除”操作的时候,发现只要是当前正在播放视频,删除当前视频前面的视频,就会导致播放器停止播放。这里我思考了,是因为播放列表移除项目后会导致QMediaPlaylist的索引发生改变,这样会很影响体验。
为此笔者对上面思路进行了改进,即不使用QMediaPlaylist,通过手写播放模式的方式控制当前播放列表,每次保证播放器的播放列表只有一个媒体,如果在列表中移除了非当前播放的项目,并不会引起播放器状态改变。
下载地址:https://wwt.lanzoul.com/izAd61s0nhfa

六.总结

本次使用PyQt5最做了一款仿暴风影音的音视频播放器,支持多种文件格式,相关功能丰富,在博文中详细介绍了软件开发的设计思路也贴出了部分代码与大家讨论,提出了我的思考,欢迎大家在评论区和我讨论交流!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280271.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【晶振选型】VCTCXO TCXO 布线 参考

一、供电旁路电容 二、使能信号 三、输出的交流耦合 四、输出波形转换 五、压控滤波电容 最后 CTS的是真不错,1K可是-140啊

手拉手整合Springboot3+RocketMQ2.3

RocketMQ 基本概念 消息模型Message Model RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,其中 Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Bro…

算法沉淀——贪心算法四(leetcode真题剖析)

算法沉淀——贪心算法四 01.最长回文串02.增减字符串匹配03.分发饼干04.最优除法 01.最长回文串 题目链接:https://leetcode.cn/problems/longest-palindrome/ 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 …

我的自建博客之旅06之Mrdoc

这个是我折腾笔记项目的最后一篇文章了,这个项目是类似于语雀的文档笔记项目,因为我当初想找一个既可以当做笔记,又可以作为团队文档分享的笔记,除了语雀,就发现了这个项目。 这个开源项目的界面或者文档组织方式其实是我最喜欢的,但是我后来放弃它的原因是它的后台编辑逻…

slab分配器

什么是slab分配器? 用户态程序可以使用malloc及其在C标准库中的相关函数申请内存;内核也需要经常分配内存,但无法使用标准库函数;linux内核中,伙伴分配器是一种页分配器,是以页为单位的,但这个…

RISC-V架构的三种特权模式如何切换

1、RISC-V的三种特权模式 特权模式功能描述机器模式(M-mode)具有最高特权等级,具有访问所有资源的权限,通常运行固件和内核用户模式(U-mode)权限要比M模式低,通常是用来运行操作系统内核管理员…

iOS常见崩溃简介

1. 崩溃 多指在移动设备(如iOS、Android设备)中或不可移动设备(如:Windows、Linux等设备), 在打开或使用应用程序时出现的突然退出中断的情况(类似于Windows的应用程序崩溃)。 多表现为&#…

2024.3.21 如何将idea的注释设置为在首字母前开始而不是句首

2024.3.21 如何将idea的注释设置为在首字母前开始而不是句首 两种写法的差异 修改办法 将右下角的勾去掉即可。

[ROS 系列学习教程] rosbag Python API

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

【Leetcode-73.矩阵置零】

题目: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2&…

echart trigger 为 axis 的时候不显示 tooltip 解决办法

echart trigger 为 axis 的时候不显示 tooltip 解决办法 在项目 vitetsvue3 中使用 echart 显示了一个曲线图: 但当把图表的 trigger 设置成 axis 的时候,鼠标扫过并不显示具体的数值,如上图所示。 但 trigger item 的时候是正常的。 解决…

在DevEco Studio中第一次使用网络图片不显示问题

当我们新建项目 第一次使用网络图片 没有显示时 加这段代码就可以了 如果刷新图片还是没有显示 就重启编辑器。 "requestPermissions": [{"name": "ohos.permission.INTERNET"}],

如何构建Docker自定义镜像

说明:平常我们使用Docker运行各种容器,极大地方便了我们对开发应用的使用,如MySQL、Redis,以及各种中间件,使用时只要拉镜像,运行容器即可。本文介绍如何创建一个Demo,自定义构建一个镜像。 开…

31.HarmonyOS App(JAVA)鸿蒙系统app Service服务的用法

鸿蒙系统app Service服务的用法 后台任务调度和管控 HarmonyOS将应用的资源使用生命周期划分为前台、后台和挂起三个阶段。前台运行不受资源调度的约束,后台会根据应用业务的具体任务情况进行资源使用管理,在挂起状态时,会对应用的资源使用进…

【研发日记】,Matlab/Simulink开箱报告(十)——Requirements Toolbox

前言 见《开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)》 见《开箱报告,Simulink Toolbox库模块使用指南(六)——S-Fuction模块(TLC)》 见《开…

Python学习:注释和运算符

python 注释 在Python中,注释用于在代码中添加解释、说明或者提醒,但并不会被解释器执行。Python中的注释以#开头,直到行末为止。下面是关于Python注释的详细解释和举例: 单行注释:使用#符号在行的开头添加注释&…

Vue3:标签的ref属性用法

一、情景说明 我们在写前端页面的时候,肯定会遇到获取DOM内容的情况。 以往,我们是用原生的js方法去获取,如document.getXxxx 但是,这中方法会有个问题,如果父组件和子组件的id相同,则会出错。 在Vue3中&…

酷开科技聚焦大屏端数据研究,构建酷开系统深度挖掘大屏商业价值

中国所有的彩色大屏中,智能电视规模已经过半,OTT平台的数据价值越发引起人们关注。作为OTT行业的头部代表,酷开科技一直聚焦大屏端数据研究,目前已经形成一套基于大屏指数的智慧营销体系,让OTT大屏的数字营销化水平实现…

安装MySQL5.7.19 + 解决数据库乱码

文章目录 1.删除mysql服务 sc delete mysql2.解压到D:\mysql5.7下3.配置管理员环境变量4.D:\mysql5.7\mysql-5.7.19-winx64下创建my.ini1.创建文件2.文件内容 5.管理员打开cmd,切换到 D:\mysql5.7\mysql-5.7.19-winx64\bin6.输入 mysqld -install 安装mysql服务7.初…

2 使用GPU理解并行计算

2.1 简介 本章旨在对并行程序设计的基本概念及其与GPU技术的联系做一个宽泛的介绍。本章主要面向具有串行程序设计经验,但对并行处理概念缺乏了解的读者。我们将用GPU的基本知识来讲解并行程序设计的基本概念。 2.2 传统的串行代码 绝大多数程序员是在串行程序占据…