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/ijKq71rlbl1i

六.总结

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

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

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

相关文章

testng测试类

第一步:在测试类中写业务逻辑测试代码在测试类中插入testng相关注解 数据驱动给test标记的方法提供数据 看数据驱动源码 在TestNG中,你可以使用DataProvider注解来标记一个方法,该方法将提供数据给测试方法。数据提供者的名称默认为方法名。…

淘宝扭蛋机小程序系统:电商娱乐新纪元,开启无限惊喜之旅

在移动互联网蓬勃发展的今天,小程序以其轻便、快捷的特性,成为了众多用户的新宠。淘宝作为国内电商领域的领军者,始终站在创新的前沿,不断探索和尝试新的商业模式。在这样的背景下,淘宝扭蛋机小程序系统应运而生&#…

JAVA-反射

JAVA-反射(reflection) 01. 一个需求引出反射 1. 问题 根据配置文件 re.properties 指定信息,创建Cat对象并调用方法hi re.properties: calssfullpathcom.yzjedu.Cat methodhi使用现有的技术,可以做到吗? cat类: package com…

网站安全监测:守护网络空间的坚实防线

随着互联网技术的飞速发展和广泛应用,网站已成为企业、机构和个人展示形象、提供服务、传递信息的重要平台。然而,与此同时,网站也面临着日益严重的安全威胁。黑客攻击、数据泄露、恶意软件等安全问题频发,给网站运营者带来了巨大…

GUROBI建模之非线性约束的处理

官方文档 目录 官方文档:GRBModel.AddGenConstrXxx() - Gurobi Optimization 数学规划的约束类型 基本约束(fundamental constraints): 通用约束(general constraints): 1. GUROBI求解器有针对这类约束的函数,直接调用这类函数即可 2.…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RichText)

富文本组件,解析并显示HTML格式文本。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件无法根据内容自适应设置宽高属性,需要开发者设置显示布局。 子组件 不包含子组…

flask库

文章目录 flask库1. 基本使用2. 路由路径和路由参数3. 请求跳转和请求参数4. 模板渲染1. 模板变量2. 过滤器3. 测试器 5. 钩子函数与响应对象 flask库 flask是python编写的轻量级框架,提供Werkzeug(WSGI工具集)和jinjia2(渲染模板…

JMH287亲测【鸣潮】一键内测风景端V1.0.2已整理并录制视频教学

资源介绍: 否需要虚拟机:否 文件大小:压缩包约15G 支持系统:win7、win10、win11 硬件需求:运行内存16G 4核及以上CPU独立显卡 资源截图: 下载地址: JMH287【鸣潮】一键端 [V1.0.2]

MySql入门教程--MySQL数据库基础操作

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

精读《精通 console.log》

1 引言 本周精读的文章是 Mastering JS console.log like a Pro,一起来更全面的认识 console 吧! 2 概述 & 精读 console 的功能主要在于控制台打印,它可以打印任何字符、对象、甚至 DOM 元素和系统信息,下面一一介绍。 c…

Linux 中搭建 主从dns域名解析服务器

CSDN 成就一亿技术人! 作者主页:点击! Linux专栏:点击! CSDN 成就一亿技术人! ————前言———— 主从(Master-Slave)DNS架构是一种用于提高DNS系统可靠性和性能的配置方式。…

以题为例浅谈文件包含

什么叫做文件包含 文件包含函数加载的参数没有经过过滤或严格定义,可以被用户控制, 包含其他恶意文件,导致了执行非预期代码。 文件包含漏洞(File Inclusion Vulnerability)是一种常见的网络安全漏洞,它允…