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

2024-03-16 20:20

本文主要是介绍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/ikucA1rmby0b

六.总结

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

这篇关于python3GUI--qt仿暴风影音视频播放器By:PyQt5(附下载地址)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816609

相关文章

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

Linux配置IP地址的三种实现方式

《Linux配置IP地址的三种实现方式》:本文主要介绍Linux配置IP地址的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录环境RedHat9第一种安装 直接配置网卡文件第二种方式 nmcli(Networkmanager command-line

使用国内镜像源优化pip install下载的方法步骤

《使用国内镜像源优化pipinstall下载的方法步骤》在Python开发中,pip是一个不可或缺的工具,用于安装和管理Python包,然而,由于默认的PyPI服务器位于国外,国内用户在安装依赖时可... 目录引言1. 为什么需要国内镜像源?2. 常用的国内镜像源3. 临时使用国内镜像源4. 永久配置国内镜

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二