对目前的视频播放器不满意?教你用Python做一个视频播放器

忘是亡心i 2023-01-02 05:21 231阅读 0赞

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ4NDA1Nzgx_size_16_color_FFFFFF_t_70

以下文章来源于Charles的皮卡丘 ,作者白露未晞me

1ce7b7c7928bdde1996dffc63821054c.png

这里我们主要利用PyQt5来带大家写个简单的视频播放器。首先,我们来初始化一下视频播放器的窗口:

  1. # 初始化窗口
  2. self.setWindowTitle('视频播放器')
  3. self.setWindowIcon(QIcon(os.path.join(os.getcwd(), 'images/icon.png')))
  4. self.setGeometry(300, 50, 810, 600)
  5. self.setWindowFlags(Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint)
  6. palette = QPalette()
  7. palette.setColor(QPalette.Background, Qt.gray)
  8. self.setPalette(palette)

其中setWindowTitle函数用于设置窗口标题,而setWindowIcon函数则用于设置窗口图标:

34124e018c6ee8c0e0b3cdf35a47ac1d.png

接着,我们来定义一些必要的组件,即视频播放插件:

  1. self.video_widget = QVideoWidget(self)
  2. self.video_widget.setGeometry(QRect(5, 5, 800, 520))
  3. palette = QPalette()
  4. palette.setColor(QPalette.Background, Qt.black)
  5. self.video_widget.setPalette(palette)
  6. self.video_widget.setStyleSheet('background-color:#000000')
  7. self.player = QMediaPlayer(self)
  8. self.player.setVideoOutput(self.video_widget)
  9. self.player.setVolume(50)

和选择视频相关的组件:

  1. # --当前的视频路径
  2. self.video_line_edit = QLineEdit('')
  3. # --选择视频按钮
  4. self.select_video_btn = QPushButton('选择')

播放和暂停按钮(需要注意的是播放和暂停按钮不能同时显示,即默认是显示播放键,隐藏暂停键,按下播放键后播放键按钮隐藏,而暂停键按钮显示,以此类推):

  1. # --播放按钮
  2. self.play_btn = QPushButton(self)
  3. self.play_btn.setIcon(QIcon(os.path.join(os.getcwd(), 'images/play.png')))
  4. self.play_btn.setIconSize(QSize(25, 25))
  5. self.play_btn.setStyleSheet('''QPushButton{border:none;}QPushButton:hover{border:none;border-radius:35px;}''')
  6. self.play_btn.setCursor(QCursor(Qt.PointingHandCursor))
  7. self.play_btn.setToolTip('播放')
  8. self.play_btn.setFlat(True)
  9. # --暂停按钮
  10. self.pause_btn = QPushButton('')
  11. self.pause_btn.setIcon(QIcon(os.path.join(os.getcwd(), 'images/pause.png')))
  12. self.pause_btn.setIconSize(QSize(25, 25))
  13. self.pause_btn.setStyleSheet('''QPushButton{border:none;}QPushButton:hover{border:none;}''')
  14. self.pause_btn.setCursor(QCursor(Qt.PointingHandCursor))
  15. self.pause_btn.setToolTip('暂停')
  16. self.pause_btn.setFlat(True)
  17. self.pause_btn.hide()

播放进度相关的组件:

  1. # --播放进度
  2. self.play_progress_label = QLabel('00:00 / 00: 00')
  3. self.play_progress_slider = QSlider(Qt.Horizontal, self)
  4. self.play_progress_slider.setMinimum(0)
  5. self.play_progress_slider.setSingleStep(1)
  6. self.play_progress_slider.setGeometry(QRect(0, 0, 200, 10))

音量控制相关的组件:

  1. # --音量控制
  2. self.volume_slider = QSlider(Qt.Horizontal)
  3. self.volume_slider.setMinimum(0)
  4. self.volume_slider.setMaximum(100)
  5. self.volume_slider.setValue(50)
  6. self.mute_btn = QPushButton('')
  7. self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), 'images/sound.png')))
  8. self.mute_btn.setIconSize(QSize(25, 25))
  9. self.mute_btn.setStyleSheet('''QPushButton{border:none;}QPushButton:hover{border:none;}''')
  10. self.mute_btn.setCursor(QCursor(Qt.PointingHandCursor))
  11. self.mute_btn.setToolTip('禁音')
  12. self.mute_btn.setFlat(True)
  13. self.volume_label = QLabel('50')

然后简单地自动布局一下:

  1. # --布局
  2. v_layout = QVBoxLayout()
  3. v_layout.setSpacing(0)
  4. v_layout.addStretch()
  5. h_layout = QHBoxLayout()
  6. h_layout.setSpacing(15)
  7. h_layout.addWidget(self.video_line_edit, 2, Qt.AlignVCenter | Qt.AlignVCenter)
  8. h_layout.addWidget(self.select_video_btn, 0, Qt.AlignCenter | Qt.AlignVCenter)
  9. v_layout.addLayout(h_layout)
  10. h_layout = QHBoxLayout()
  11. h_layout.setSpacing(2)
  12. h_layout.addWidget(self.play_btn, 0, Qt.AlignCenter | Qt.AlignVCenter)
  13. h_layout.addWidget(self.pause_btn, 0, Qt.AlignCenter | Qt.AlignVCenter)
  14. h_layout.addWidget(self.play_progress_label, 0, Qt.AlignCenter | Qt.AlignVCenter)
  15. h_layout.addWidget(self.play_progress_slider, 15, Qt.AlignVCenter | Qt.AlignVCenter)
  16. h_layout.addWidget(self.mute_btn, 0, Qt.AlignCenter | Qt.AlignVCenter)
  17. h_layout.addWidget(self.volume_slider, 0, Qt.AlignCenter | Qt.AlignVCenter)
  18. h_layout.addWidget(self.volume_label, 0, Qt.AlignCenter | Qt.AlignVCenter)
  19. v_layout.addLayout(h_layout)
  20. self.setLayout(v_layout)

接着,我们来实现一下各个控件可以触发的功能。首先是播放和暂停功能,这个很简单,代码如下:

  1. '''播放视频'''
  2. def playvideo(self):
  3. if self.player.duration() == 0: return
  4. self.play_btn.hide()
  5. self.pause_btn.show()
  6. self.player.play()
  7. '''暂停视频'''
  8. def pausevideo(self):
  9. if self.player.duration() == 0: return
  10. self.play_btn.show()
  11. self.pause_btn.hide()
  12. self.player.pause()

需要注意的是点击播放和暂停按钮的时候需要同时切换一下按钮的状态(即点击完暂停键需要显示播放键隐藏暂停键,点击完播放键需要显示暂停键隐藏播放键,以实现按键切换形态的效果)。

在播放的过程中,记得实时地修改进度条的显示:

  1. '''播放进度设置'''
  2. def setPlayProgress(self):
  3. _, right = self.play_progress_label.text().split('/')
  4. position = self.player.position() + 1
  5. second = int(position / 1000 % 60)
  6. minute = int(position / 1000 / 60)
  7. left = str(minute).zfill(2) + ':' + str(second).zfill(2)
  8. self.play_progress_label.setText(left + ' /' + right)
  9. self.play_progress_slider.setValue(position)

对了,播放视频之前我们需要打开视频文件,功能实现如下:

  1. '''打开视频文件'''
  2. def openvideo(self):
  3. # 打开并显示视频路径
  4. filepath = QFileDialog.getOpenFileName(self, '请选择视频', '.')
  5. if filepath[0]:
  6. self.video_line_edit.setText(filepath[0])
  7. # 将视频路径初始化进视频播放插件
  8. filepath = self.video_line_edit.text()
  9. if not os.path.exists(filepath): return
  10. fileurl = QUrl.fromLocalFile(filepath)
  11. if fileurl.isValid():
  12. self.player.setMedia(QMediaContent(fileurl))
  13. self.player.setVolume(50)

接着是拖动视频播放进度条的功能:

  1. '''播放进度条按下ing事件'''
  2. def playProgressSliderPressed(self):
  3. if self.player.state() != 0: self.player.pause()
  4. '''播放进度条按下释放事件'''
  5. def playProgressSliderReleased(self):
  6. if self.player.state() != 0:
  7. self.player.setPosition(self.play_progress_slider.value())
  8. self.player.play()

即拖动进度条的过程中暂停播放视频,拖动结束后将视频的播放进度切换到和进度条相对应的位置。

音量控制功能(这个原理和拖动视频播放进度条的实现类似):

  1. '''设置音量'''
  2. def setVolume(self):
  3. value = self.volume_slider.value()
  4. if value:
  5. self.player.setMuted(False)
  6. self.player.setVolume(value)
  7. self.volume_label.setText(str(value))
  8. self.volume_slider.setValue(value)
  9. self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), 'images/sound.png')))
  10. else:
  11. self.player.setMuted(True)
  12. self.volume_label.setText('0')
  13. self.volume_slider.setValue(0)
  14. self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), 'images/mute.png')))

最后一个小细节,当视频播放器的窗口大小改变时,我们自适应地修改播放插件的窗口大小:

  1. '''改变窗口大小'''
  2. def resizeEvent(self, event):
  3. size = event.size()
  4. self.video_widget.setGeometry(5, 5, size.width() - 5, size.height() - 80)

发表评论

表情:
评论列表 (有 0 条评论,231人围观)

还没有评论,来说两句吧...

相关阅读