摘要:还记得上学那会,寝室的同学都用的暴风影音,那个时候暴风是真良心,无广告支持的视频格式多,总之用起来非常棒。慢慢地暴风广告越来越多,用起来也越来越卡,也就弃坑了。
各位新老朋友下午好,我是木木子!掌声在哪里~
咳咳咳.....算了没掌声我也还是要继续叨叨!
大家电脑上应该都有视频播放器吧,什么QQ影音、迅雷影音、暴风影音等各种影音。
还记得上学那会,寝室的同学都用的暴风影音,那个时候暴风是真良心,无广告、支持的视频格式多,总之用起来非常棒。
慢慢地暴风广告越来越多,用起来也越来越卡,也就弃坑了。
今天要给大家分享的是制作一款专属自己的无广告、无弹窗的视频播放器,来继续往下看!
本文是基于Pyqt5的界面化小程序专属播放器,大家可以多多优化修改界面使其更完美吖!
准备好简单的播放器素材按钮:
附主源码:
class VideoPlayer(QWidget): def __init__(self, parent=None, **kwargs): super(VideoPlayer, self).__init__(parent) # 初始化窗口 self.setWindowTitle("专属视频播放器 ") self.setWindowIcon(QIcon(os.path.join(os.getcwd(), "images/icon.png"))) self.setGeometry(300, 50, 810, 600) self.setWindowFlags(Qt.WindowCloseButtonHint | Qt.WindowMinimizeButtonHint) palette = QPalette() palette.setColor(QPalette.Background, Qt.gray) self.setPalette(palette) # 定义组件 # --视频播放插件 self.video_widget = QVideoWidget(self) self.video_widget.setGeometry(QRect(5, 5, 800, 520)) palette = QPalette() palette.setColor(QPalette.Background, Qt.black) self.video_widget.setPalette(palette) self.video_widget.setStyleSheet("background-color:#000000") self.player = QMediaPlayer(self) self.player.setVideoOutput(self.video_widget) self.player.setVolume(50) # --当前的视频路径 self.video_line_edit = QLineEdit("") # --选择视频按钮 self.select_video_btn = QPushButton("选择") # --播放按钮 self.play_btn = QPushButton(self) self.play_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/play.png"))) self.play_btn.setIconSize(QSize(25, 25)) self.play_btn.setStyleSheet("""QPushButton{border:none;}QPushButton:hover{border:none;border-radius:35px;}""") self.play_btn.setCursor(QCursor(Qt.PointingHandCursor)) self.play_btn.setToolTip("播放") self.play_btn.setFlat(True) # --暂停按钮 self.pause_btn = QPushButton("") self.pause_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/pause.png"))) self.pause_btn.setIconSize(QSize(25, 25)) self.pause_btn.setStyleSheet("""QPushButton{border:none;}QPushButton:hover{border:none;}""") self.pause_btn.setCursor(QCursor(Qt.PointingHandCursor)) self.pause_btn.setToolTip("暂停") self.pause_btn.setFlat(True) self.pause_btn.hide() # --播放进度 self.play_progress_label = QLabel("00:00 / 00: 00") self.play_progress_slider = QSlider(Qt.Horizontal, self) self.play_progress_slider.setMinimum(0) self.play_progress_slider.setSingleStep(1) self.play_progress_slider.setGeometry(QRect(0, 0, 200, 10)) # --音量控制 self.volume_slider = QSlider(Qt.Horizontal) self.volume_slider.setMinimum(0) self.volume_slider.setMaximum(100) self.volume_slider.setValue(50) self.mute_btn = QPushButton("") self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/sound.png"))) self.mute_btn.setIconSize(QSize(25, 25)) self.mute_btn.setStyleSheet("""QPushButton{border:none;}QPushButton:hover{border:none;}""") self.mute_btn.setCursor(QCursor(Qt.PointingHandCursor)) self.mute_btn.setToolTip("禁音") self.mute_btn.setFlat(True) self.volume_label = QLabel("50") # --布局 v_layout = QVBoxLayout() v_layout.setSpacing(0) v_layout.addStretch() h_layout = QHBoxLayout() h_layout.setSpacing(15) h_layout.addWidget(self.video_line_edit, 2, Qt.AlignVCenter | Qt.AlignVCenter) h_layout.addWidget(self.select_video_btn, 0, Qt.AlignCenter | Qt.AlignVCenter) v_layout.addLayout(h_layout) h_layout = QHBoxLayout() h_layout.setSpacing(2) h_layout.addWidget(self.play_btn, 0, Qt.AlignCenter | Qt.AlignVCenter) h_layout.addWidget(self.pause_btn, 0, Qt.AlignCenter | Qt.AlignVCenter) h_layout.addWidget(self.play_progress_label, 0, Qt.AlignCenter | Qt.AlignVCenter) h_layout.addWidget(self.play_progress_slider, 15, Qt.AlignVCenter | Qt.AlignVCenter) h_layout.addWidget(self.mute_btn, 0, Qt.AlignCenter | Qt.AlignVCenter) h_layout.addWidget(self.volume_slider, 0, Qt.AlignCenter | Qt.AlignVCenter) h_layout.addWidget(self.volume_label, 0, Qt.AlignCenter | Qt.AlignVCenter) v_layout.addLayout(h_layout) self.setLayout(v_layout) # 事件绑定 self.player.durationChanged.connect(self.setVideoLength) self.player.positionChanged.connect(self.setPlayProgress) self.select_video_btn.clicked.connect(self.openvideo) self.play_btn.clicked.connect(self.playvideo) self.pause_btn.clicked.connect(self.pausevideo) self.mute_btn.clicked.connect(self.mute) self.volume_slider.valueChanged.connect(self.setVolume) self.play_progress_slider.sliderPressed.connect(self.playProgressSliderPressed) self.play_progress_slider.sliderReleased.connect(self.playProgressSliderReleased) """播放进度条按下ing事件""" def playProgressSliderPressed(self): if self.player.state() != 0: self.player.pause() """播放进度条按下释放事件""" def playProgressSliderReleased(self): if self.player.state() != 0: self.player.setPosition(self.play_progress_slider.value()) self.player.play() """播放视频""" def playvideo(self): if self.player.duration() == 0: return self.play_btn.hide() self.pause_btn.show() self.player.play() """暂停视频""" def pausevideo(self): if self.player.duration() == 0: return self.play_btn.show() self.pause_btn.hide() self.player.pause() """禁音""" def mute(self): if self.player.isMuted(): self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/sound.png"))) self.player.setMuted(False) self.volume_label.setText("50") self.volume_slider.setValue(50) self.player.setVolume(50) else: self.player.setMuted(True) self.volume_label.setText("0") self.volume_slider.setValue(0) self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/mute.png"))) """打开视频文件""" def openvideo(self): # 打开并显示视频路径 filepath = QFileDialog.getOpenFileName(self, "请选择视频", ".") if filepath[0]: self.video_line_edit.setText(filepath[0]) # 将视频路径初始化进视频播放插件 filepath = self.video_line_edit.text() if not os.path.exists(filepath): return fileurl = QUrl.fromLocalFile(filepath) if fileurl.isValid(): self.player.setMedia(QMediaContent(fileurl)) self.player.setVolume(50) """设置音量""" def setVolume(self): value = self.volume_slider.value() if value: self.player.setMuted(False) self.player.setVolume(value) self.volume_label.setText(str(value)) self.volume_slider.setValue(value) self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/sound.png"))) else: self.player.setMuted(True) self.volume_label.setText("0") self.volume_slider.setValue(0) self.mute_btn.setIcon(QIcon(os.path.join(os.getcwd(), "images/mute.png"))) """播放进度设置""" def setPlayProgress(self): _, right = self.play_progress_label.text().split("/") position = self.player.position() + 1 second = int(position / 1000 % 60) minute = int(position / 1000 / 60) left = str(minute).zfill(2) + ":" + str(second).zfill(2) self.play_progress_label.setText(left + " /" + right) self.play_progress_slider.setValue(position) """视频时长显示更改""" def setVideoLength(self): left, _ = self.play_progress_label.text().split("/") duration = self.player.duration() self.play_progress_slider.setMaximum(duration) second = int(duration / 1000 % 60) minute = int(duration / 1000 / 60) right = str(minute).zfill(2) + ":" + str(second).zfill(2) self.play_progress_label.setText(left + "/ " + right) """关闭窗口""" def closeEvent(self, event): self.player.stop() """改变窗口大小""" def resizeEvent(self, event): size = event.size() self.video_widget.setGeometry(5, 5, size.width() - 5, size.height() - 80)
效果如下:
啊~~击中我的心脏,我“死了”~真好看~
好啦!我又活过来了,这款专属的视频播放器你也想拥有嘛?
如需完整的项目源码+全部的素材老规矩源码基地见:#私信小编06#或者点击蓝色字体即可免费获取打包的源码!
记得三连哦~mua 你们的支持是我最大的动力!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/120953.html
摘要:注意该方法的作用和方法类似,只有一个区别,就是方法接受的是若干个参数的列表,而方法接受的是一个包含多个参数的数组。指定的参数列表。返回值返回值是你调用的方法的返回值,若该方法没有返回值,则返回。 温馨提示:作者的爬坑记录,对你等大神完全没有价值,别在我这浪费生命温馨提示-续:打call原本是属于我们偶像宅文化中的专业名词,指的是饭们在看live时在台下配合爱豆演出的节奏喊口号,举例:超...
摘要:分享一些超好用插件,打造一个不一样的浏览器编辑器。一谷歌浏览器插件谷歌访问助手强烈推荐一键安装,无需其他配置,即可访问谷歌。谷歌浏览器是很耗内存的,该插件会自动挂起长时间未使用的网页,来释放系统资源。 showImg(https://segmentfault.com/img/remote/1460000014011338); 分享一些超好用插件,打造一个不一样的 GitHub、浏览器、...
摘要:分享一些超好用插件,打造一个不一样的浏览器编辑器。一谷歌浏览器插件谷歌访问助手强烈推荐一键安装,无需其他配置,即可访问谷歌。谷歌浏览器是很耗内存的,该插件会自动挂起长时间未使用的网页,来释放系统资源。 showImg(https://segmentfault.com/img/remote/1460000014011338); 分享一些超好用插件,打造一个不一样的 GitHub、浏览器、...
摘要:远程医疗这一概念被提出后,已经被广泛应用。但是,如何提高视频传输性能,如何确保家庭基层医疗机构和户外应急的远程医疗快速接入,是当前的远程医疗业务系统面临的主要挑战。 编者按:近日,Gartner最新发布了一份《Five Key Essentials for the New Generation of Intelligent Video Cloud》白皮书报告,报告中针对各行业在视频应用...
摘要:对下半年所分享的文章进行整理,上半年总结的篇好文请点击这里,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可以查找了。 对下半年所分享的文章进行整理,上半年总结的 98 篇好文请点击这里,很多读者当时忘记了收藏,以致于查找一篇历史文章很费劲,因此在这里顺便做下记录。目前就分下下面几个大类,没有更多细分,已基本可...
阅读 2722·2021-11-23 09:51
阅读 2938·2021-11-12 10:36
阅读 1129·2021-11-12 10:34
阅读 3586·2021-10-08 10:04
阅读 3004·2021-09-27 13:37
阅读 2119·2021-09-24 09:48
阅读 3031·2021-08-17 10:15
阅读 2406·2019-08-30 15:55