【发布时间】:2019-06-22 07:20:27
【问题描述】:
我有一个视频,我从其中按时间间隔获取一些剪辑,我想做以下事情:
- 让剪辑一个接一个地播放 - 所以第一个剪辑播放,然后在它完成后,然后第二个播放,依此类推...但是目前,这很好,但它只是在时间间隔之间播放这两个剪辑,我不希望它这样做。
我该怎么做呢?
我尝试使用例如pause、stop 等等……简直就是一切,但它们都不起作用。
我的python版本:3.6.0
和 PyQt:5.6
视频播放器文件(repl 的链接,因为它太长了):
https://repl.it/repls/SuperBrownSoftware
(只需将其复制到您的 IDE 中)
这是我应该运行的代码:
from PyQt5 import QtCore, QtGui, QtWidgets, QtMultimedia
from PyQt5.QtWidgets import *
import sys
from pyqtvideo2_copy import *
app = QtWidgets.QApplication(sys.argv)
video = VideoWidget()
w = QtWidgets.QWidget()
w.fr = QtWidgets.QGridLayout(w)
w.bt = QtWidgets.QPushButton()
w.fr.addWidget(w.bt)
w.player_=Player(sys.argv[1:])
w.fr.addWidget(w.player_)
print(w)
video.activateWindow()
def clicked():
l=[[2000,4000],[10000,15000]]
for i in l:
w.player_.setPosition(i[0])
w.player_.player.pause()
w.player_.player.play()
w._end=i[1]
w.player_.player.positionChanged.connect(on_positionChanged)
def on_positionChanged(position):
if w.player_.player.state() == QtMultimedia.QMediaPlayer.PlayingState:
if position > w._end:
w.player_.player.stop()
def except_hook(cls, exception, traceback):
sys.__excepthook__(cls, exception, traceback)
w.bt.clicked.connect(clicked)
w.show()
sys.excepthook=except_hook
sys.exit(app.exec_())
更新:
我现在得到了 ekhumoro 的答案,所以我正在使用这个结构设置:
class Ui_MainWindow(QMainWindow):
def setupUi(self, MainWindow):
...
def retranslateUi(self, MainWindow):
...
self.player.positionChanged.connect(self.handlePositionChanged)
self.player.mediaStatusChanged.connect(self.handleMediaStateChanged)
...
def videoclips(self):
self.w=QWidget()
g=QGridLayout(self.w)
g.setContentsMargins(0,0,0,0)
d=TableWidget(self.df2,self.clicked)
g.addWidget(d)
self.w.show()
def clicked(self,item):
self.w.close()
self.addMedia(ast.literal_eval(item.text()))
def addMedia(self, clips):
self._index = -1
self._clips = clips
def playNext(self):
self.player.player.pause()
self._index += 1
if 0 <= self._index < len(self._clips):
self.player.player.setPosition(self._clips[self._index][0])
self.player.player.play()
def handlePositionChanged(self, pos):
if (0 <= self._index < len(self._clips) and
pos > self._clips[self._index][1] and
self.player.player.state() == QtMultimedia.QMediaPlayer.PlayingState):
self.playNext()
def handleMediaStateChanged(self, state):
if state == QtMultimedia.QMediaPlayer.LoadedMedia:
self.playNext()
我将 ekhumoro 的答案函数复制到我的代码中,然后添加了两行:self.player.positionChanged.connect(self.handlePositionChanged) 和 self.player.mediaStatusChanged.connect(self.handleMediaStateChanged)
在retranslateUi
但这似乎不起作用,我觉得我做错了。
它给了我一个错误:
AttributeError: 'Ui_MainWindow' object has no attribute '_index'
【问题讨论】:
标签: python pyqt pyqt5 qmediaplayer