Python中如何使用PyQt5创建一个播放器?

image

特性

使用方法

# Ubuntu 用户可以依次执行以下命令进行安装
sudo apt-get install python3-pyqt5  # 安装 Python PyQt5 依赖包
sudo apt-get install libmpv1        # 安装 libmpv1 系统依赖

pip3 install ‘feeluown>=2.0’ --user -i https://pypi.org/simple/

为 feeluown 生成图标( Linux 用户)

feeluown-genicon # 生成图标,点击桌面图标就可以运行 feeluown # 也可以在命令行中运行

更多效果图和演示视频: https://github.com/cosven/FeelUOwn/wiki/Gallery

另外一个细节更多的分享帖: https://www.v2ex.com/t/476376

last but not least


Python中如何使用PyQt5创建一个播放器?

87 回复
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class VideoPlayer(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 视频播放器")
        self.setGeometry(100, 100, 800, 600)
        
        # 创建媒体播放器
        self.media_player = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        
        # 创建视频显示部件
        self.video_widget = QVideoWidget()
        self.setCentralWidget(self.video_widget)
        self.media_player.setVideoOutput(self.video_widget)
        
        # 创建控制栏
        self.create_controls()
        
        # 连接信号
        self.media_player.stateChanged.connect(self.on_state_changed)
        self.media_player.positionChanged.connect(self.on_position_changed)
        self.media_player.durationChanged.connect(self.on_duration_changed)
        
    def create_controls(self):
        # 创建工具栏
        control_bar = QToolBar()
        self.addToolBar(Qt.BottomToolBarArea, control_bar)
        
        # 播放/暂停按钮
        self.play_btn = QPushButton()
        self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.play_btn.clicked.connect(self.play_video)
        control_bar.addWidget(self.play_btn)
        
        # 停止按钮
        stop_btn = QPushButton()
        stop_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        stop_btn.clicked.connect(self.stop_video)
        control_bar.addWidget(stop_btn)
        
        # 进度条
        self.slider = QSlider(Qt.Horizontal)
        self.slider.sliderMoved.connect(self.set_position)
        control_bar.addWidget(self.slider)
        
        # 音量控制
        volume_label = QLabel("音量:")
        control_bar.addWidget(volume_label)
        
        self.volume_slider = QSlider(Qt.Horizontal)
        self.volume_slider.setRange(0, 100)
        self.volume_slider.setValue(70)
        self.volume_slider.valueChanged.connect(self.set_volume)
        control_bar.addWidget(self.volume_slider)
        
        # 打开文件按钮
        open_btn = QPushButton("打开文件")
        open_btn.clicked.connect(self.open_file)
        control_bar.addWidget(open_btn)
        
    def open_file(self):
        file_name, _ = QFileDialog.getOpenFileName(self, "选择视频文件", 
                                                  "", "视频文件 (*.mp4 *.avi *.mkv *.mov)")
        if file_name:
            self.media_player.setMedia(QMediaContent(QUrl.fromLocalFile(file_name)))
            self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
            
    def play_video(self):
        if self.media_player.state() == QMediaPlayer.PlayingState:
            self.media_player.pause()
            self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        else:
            self.media_player.play()
            self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
            
    def stop_video(self):
        self.media_player.stop()
        self.play_btn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        
    def set_position(self, position):
        self.media_player.setPosition(position)
        
    def set_volume(self, volume):
        self.media_player.setVolume(volume)
        
    def on_state_changed(self, state):
        pass
        
    def on_position_changed(self, position):
        self.slider.setValue(position)
        
    def on_duration_changed(self, duration):
        self.slider.setRange(0, duration)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    player = VideoPlayer()
    player.show()
    sys.exit(app.exec_())

这个播放器包含了基本功能:打开视频文件、播放/暂停、停止、进度控制和音量调节。核心是QMediaPlayer处理媒体播放,QVideoWidget显示视频。控制逻辑通过按钮点击事件和滑块移动事件实现,媒体状态变化通过信号槽机制实时更新界面。

建议先跑通基础功能再考虑添加字幕、播放列表等高级特性。

收集了一波收藏,但是却没有评论,心痛。
早知道应该把标题改成:Python 3 是世界上最好的语言…

不错,然鹅我还是用 spotify 好了

界面很舒服,楼主是自己设计的么?还是 GNOME 的默认样子呀 itunes 的感觉。

不错哟, 学习了

赞一个

赞,支持一波。
最近正在学 PyQt5, 刚学了一些基本的布局、部件等,看的是一些基础的文档,请问楼主进一步界面设计的学习路线?
先学习一波楼主源码~

好像 itunes 哦

恩,是自己瞎设计的。这个「设计」诞生的背景是当时我觉得 Qt 组件原生在 macOS 下太难看了,于是瞎设计了这个主题,当时主要参考了 itunes 的结构。

个人感受:把布局给设计好了,整体就会不错,颜色或者图标等一些东西其次。

GNOME 下也可以长这样子,这相当于是这个播放器的一个主题。

很赞的感觉…不过有 fb 了…


我自己以前学习 PyQt5 的思路主要是实践 + 看文档。

个人感觉大概的思路是:
1. 看基础教程和一些例子,了解 PyQt5 能干什么
2. 然后自己写一个 Hello world 例子
3. 然后就可以写一些有实际作用的项目了 -> 这时主要是靠搜索 + 模仿教程
4. 之后基本就可以看着文档写自己想写的东西了;
这时也可以参加一些其他开源项目,比如这个,哈哈哈

pyside2 和 pyqt5 比较咋样。。。


这是当时学习的一些笔记,比较很真实记录当时的学习过程。(内容在现在可能没有很大参考价值,思路可能会有)

以前用 spotify 的时候,感觉国内的音乐不是很多?(不确定是不是姿势不太对)

恩,这个界面主要是模仿 itunes 瞎弄的

fb 是什么呀?之前好像没有听说过,还是说这个简写我没有听说过

港区就很多

哦,这样纸…

咋一看以为是 itunes

待我拜读学习一哈。

嗯,记忆中,pyside 相比于 pyqt 的好处是它可以商用?
pyside 中间黄了一段时间,最近又重新被捡起来了,在开发和功能方面,暂时没有看到 pyside 有什么明显优势。
我也没太关注 pyside 的发展,呜呜呜

看来确实和 itunes 太像了…大家都这么说

反思了一下,这个配色和 itunes 的太像了。布局本来也是从 itunes 那里模仿过来的。

楼主做得不错

来来来,一起搞!

点击可登陆,点了半天没发现可以登录,登录窗口跑后面去了,最后发现,我点成双击了。
播放列表上面的图片太大了,右侧空劳劳的。
音乐播放器不都是这种界面了,没觉得跟 iTunes 多像啊。


猜测你是在 linux 上使用的,截图是我给 macOS 定制的一个主题。
在 linux 上目前没有使用这个主题,之后会给它加一个主题切换的功能。

右边空唠唠的话,应该是播放列表没有描述,之后我也想想怎么优化这个 case

3 年前,看到楼主在 OsChina 的帖子,自己仿着楼主撸了个:
https://github.com/HuberTRoy/NetEase

1 年前,偶然翻到楼主在 Github 上的仓库,心生羡慕,又做了一个全新版本:
https://github.com/HuberTRoy/MusicBox

ai…最初的摸索阶段,踩在了巨人的肩膀上。感谢~。

啊,才注意到我的播放界面和你的基本不一样。

以前搞过 pyqt,好久没碰了……

嗯,截图是我给 macOS 定制的一个主题,之前有朋友跟我说 你软件 在 mac 好难看,于是当时折腾了一下。

我稍后加个切换主题的功能 ୧(๑•̀⌄•́๑)૭

话说你这个是什么桌面呀?我自己只试过 kde plasma 和 gnome

哈哈哈,可能工作上很少会用到把

哇,cool

感觉你做的比我的完整很多,棒!

要是能支持 Apple Music 就好了,虽然 itunes 自己就支持但它真的太难用了

记得原来是高仿网易云音乐的,还蛮好看,现在怎么回到原始状态了?
能不能上 css 调调色

可以上调色,其实上面的额截图就是一个例子。之前没有时间弄太多主题,主要精力是在重构,调整代码结构,让新人也能参与开发 ~

感觉大家对主题的需求还挺多,我这两天抽时间搞一搞

Apple Music,这个我倒是没有考虑过,我记一下,看看有没有可能实现。

哦,这样子,难怪感觉这些图标貌似没有见过。


> python3 -c "import base64; print(base64.b64decode(b’dGluay5pbQ==’))"
tink.im

膜拜大佬

音乐是优雅的,如果播放器很丑,那简直不能忍

鉴于大家都说长得不好看,于是 Linux 下默认主题长得不好看,于是发了个新版本 2.0.1

大家有兴趣可以升级或者安装最新版 cc

> Linux 下默认主题长得不好看,于是发了个新版本 2.0.1

在 2.0.1 中,Linux 下也默认使用 macOS 的主题,也就是长得和上面截图会很像。

好厉害,多长时间搞定的?

请问,如果想在没有 python 环境或 pyqt 环境的电脑下运行,应该怎么打包应用?

可以可以,很强势

分阶段的,三年前就开始做了。不过后来工作之后,就没啥时间开发了,最近集中的改进了一下 ~

赞一个👍

你是说 windows 吗?

如果是 linux 和 macOS 的话,可以先安装 python 及其相关依赖,方法也很简单。当然以后精力或者有更多朋友一起开发的话,也可以给这两个平台打包。

如果是 windows 的话,目前还有点麻烦,个人没有 windows 系统,不太方便之后进行打包和测试。不过大家需求多的话,我近期也会想办法搞一下这个事情,昨天也有朋友说可以帮忙先试试 windows 下打包。

(⁄ ⁄•⁄ω⁄•⁄ ⁄)

向楼主学习。
表达一下我的敬意。

其实这东西也不是很复杂,有兴趣可以一起来玩呀。

pyside2 最近官方接盘了。。所以我就关注了起来。。

打包后大概有多大呢

按步骤安装完后(没有报错提示),bash 里输入 feeluown 提示未找到命令… 系统是 Ubuntu 18.04LTS

打成什么包之后?没有太明白

如果是打成 Linux deb 包的话,应该小于 1MiB ;如果是打成 Windows 包的话,目前还没测试过,根据三年前经验估计得有个 80 MiB 左右。

这是我见过最漂亮的 qt 界面


:kissing_heart:

厉害了,手动点赞

🙈 谢谢夸奖

界面挺舒服的~

不错不错,收藏一啵^ 3 ^

Debian sid + XFCE4 装上太丑了,暂时还是先 star 着吧

( ˃᷄˶˶̫˶˂᷅ )羞 我待会自己试一下,看看能不能改进下


https://github.com/cosven/FeelUOwn/wiki/Gallery#xfce4-%E6%95%88%E6%9E%9C%E9%A2%84%E8%A7%88

我试了下,还行吧。你可以用上面写的一条命令,更新到最新版试试 ~ 应该会好看很多 ~

安装路径也很奇怪,直接在 ~/.local/bin 下干出一个目录自己用,感觉很霸道😳

foobar2000,等级低回复不了图片…

这个是 pip3 自动安装的 🙈
~/.local 其实是个标准路径的:
https://www.freedesktop.org/software/systemd/man/file-hierarchy.html#Home%20Directory

看了下 foobar,感觉这东西还挺厉害,挺稳定的样子。

原来是这样啊,不好意思不好意思,那是我的锅

我觉得下面部分不好看

下面那个,感觉左边再宽一点会好看很多

( ˃᷄˶˶̫˶˂᷅ )

界面不错,不过 🎵这个符号用得太多了;

有没有插件系统?

有的,不过现在还写相关文档
https://github.com/cosven/feeluown-mpris2-plugin

这是一个例子,这里是插件的加载逻辑,非常简单
https://github.com/cosven/FeelUOwn/blob/master/feeluown/plugin.py

赞一个,马克一下

回到顶部