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

news2024/11/24 17:21:47

文章目录

  • 一.前言
  • 二.环境
    • 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 sys

from PyQt5 import QtCore
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QSlider


class 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/ikucA1rmby0b

六.总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实在智能Agent——RPA终极进化方向

RPA技术备受瞩目,它通过“机器人”自动化了人力执行的重复性、低复杂度任务,解放了员工并降低了企业成本。RPA机器人全天候运行,避免人为错误,高效处理任务,成为处理事务、操作数据、回应查询的理想选择。在管理后台&a…

HTML基础:了解CSS的3种创建方法

你好,我是云桃桃。 CSS,即层叠样式表(Cascading Style Sheets),是一种用于描述网页样式和布局的标记语言。它通过定义样式规则来控制网页元素的外观和排版,包括文字大小、颜色、边距、背景等,从…

mac打开exe文件的三大方法 mac怎么运行exe文件 mac打开exe游戏 macbookpro打开exe

exe文件是Windows系统的可执行文件,虽然Mac系统上无法直接打开exe文件,但是你可以在Mac电脑上安装双系统或者虚拟机来实现mac电脑上运行exe文件。除了这两种方法之外,你还可以在Mac电脑上使用类虚拟机软件打开exe文件,这三种方法各…

基于springboot的高校化学试剂仓储管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

大数据面试题之SQL题

大数据面试题之SQL题 1.有一个录取学生人数表,记录的是每年录取学生人数和入学学生的学制 以下是表结构: CREATE TABLE admit ( id int(11) NOT NULL AUTO_INCREMENT, year int(255) DEFAULT NULL COMMENT ‘入学年度’, num int(255) DEFAULT NULL COMM…

opencv中的图像均值模糊—blur

平均模糊是通过对图像的每个像素及其周围像素的值求平均来实现的。 blur函数通过计算输入图像image中每个像素及其邻域内像素的平均值来工作。 // 图像卷积 void QuickDemo::Conv_image_demo(Mat &image) {Mat dst;blur(image, dst, Size(3, 3), Point(-1, -1));// Point(…

Android 地图SDK 设置中心点和缩放比例

问题 Android 地图SDK 设置中心点和缩放比例 详细问题 笔者进行Android 项目开发,接入高德地图SDK。但是默认在地图所设置的中心点为北京天安门,缩放比例固定。如何修改 期望效果 解决方案 import com.amap.api.maps.model.LatLng; import com.amap…

基于java+springboot+vue实现的学生宿舍管理系统(文末源码+Lw+ppt)23-438

摘 要 伴随着我国社会的发展,人民生活质量日益提高。于是对贵工程学生宿舍进行规范而严格是十分有必要的,所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套贵工程学生宿舍管理系统&#xff0…

【机器学习300问】35、什么是随机森林?

〇、让我们准备一些训练数据 idx0x1x2x3x4y04.34.94.14.75.5013.96.15.95.55.9022.74.84.15.05.6036.64.44.53.95.9146.52.94.74.66.1152.76.74.25.34.81 表格中的x0到x4一共有5个特征,y是目标值只有0,1两个值说明是一个二分类问题。 关于决策树相关的前置知识&am…

实现一个横向的picker

Picker 选择器显示一个或多个选项集合的可滚动列表,相比于原生 picker,实现了 iOS 与 Android 端体验的一致性。 要实现横向 picker,其实跟纵向 picker差不多,都支持滚动时停留在指定位置,并且支持滚动到边界支持反弹…

代码随想录 贪心算法-难度题目-其他题目

目录 53.最大子数组和 134.加油站 968.监控二叉树 53.最大子数组和 53. 最大子数组和 中等 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个…

HJ212协议C#代码解析实现

HJ212协议C#代码解析实现 HJ212协议是环保中一个非常重要的标准协议(字符串协议),之前写了两篇C HJ212协议解析的相关博文: 环保 HJ212协议解析基于Qt5.14.2的HJ212 TCP服务端接收解析入库程序 最近在学习C#,所以打算…

T1.数据库MySQL

二.SQL分类 2.1 DDL 2.1.1数据库操作 1). 查询所有数据库 show databases ; 2). 查询当前数据库 select database(); 3)创建数据库 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则] ; 4)删除数据库 drop database …

【你也能从零基础学会网站开发】Web建站之jQuery进阶篇 jQuery常见属性和方法概述与使用

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 jQuery创建新的…

Docker 哲学 - 容器操作 (二)

命令行启动 参数键值之间可以使 " " 或者 空格 卷的挂载是在容器创建时指定的,不能在容器运行时再添加 当加上 --network-alias 设置同一网络下别名参数后 ,inspect 该容器发现 会同步到 容器信息中 2、给容器打日志 docker logs 【-…

PHP+golang开源办公系统CRM管理系统

基于ThinkPHP6 Layui MySQL的企业办公系统。集成系统设置、人事管理、消息管理、审批管理、日常办公、客户管理、合同管理、项目管理、财务管理、电销接口集成、在线签章等模块。系统简约,易于功能扩展,方便二次开发。 服务器运行环境要求 PHP > 7.…

静态库与动态库的制作和使用

个人主页:Lei宝啊 愿所有美好如期而遇 目录 前言 库? 为什么要使用库 静态库 静态库的制作和使用 动态库 动态库的制作和使用 四种方法: 直接将库拷贝(安装)到系统路径中 配置环境变量 软链接 添加配置文件 动态库和静态库同时…

jvm 内存泄露、内存溢出、栈溢出区别

JVM(Java虚拟机)是负责执行Java程序的运行环境。以下是对内存泄露、内存溢出和栈溢出这几个概念的解释: 内存泄露(Memory Leak): 内存泄露指的是程序中分配的内存空间在不再被使用时没有被释放的情况。这可…

【python】集合

前言 简洁整理,无废话 集合概念 含义:跟数学中的基本一样 形式:{1,a,(1,2)} 性质:不重复性,集合中每个元素不会有重复;集合中必须是不可变元素,不能有列表可以有元组 创建:{}或…

2核4g服务器可以带多少用户?

腾讯云轻量应用服务器2核4G5M配置性能测评,腾讯云轻量2核4G5M带宽服务器支持多少人在线访问?并发数10,支持每天5000IP人数访问,腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线?并发数测试、CPU性能、内存性能、…