gpt4 book ai didi

python - 如何依次播放视频的多个片段

转载 作者:太空狗 更新时间:2023-10-30 02:51:54 24 4
gpt4 key购买 nike

我有一个视频,我按时间间隔从中获取一些剪辑,我想执行以下操作:

  • 让剪辑一个接一个地播放 - 所以第一个剪辑播放,然后播放完毕,然后播放第二个,依此类推......但是目前,它很好,但它只是在时间间隔之间播放这两个剪辑,我不希望它这样做。

我该怎么做呢?

我尝试使用例如pausestop 等等...只是一切,但没有一个有效。

我的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'

最佳答案

一种方法是创建一个简单的队列,然后等待每个剪辑完成,然后再移动到队列中的下一个项目。下面是一个简单的演示,展示了如何实现这一点。希望应该很容易看出如何将其适应您自己的代码。

import sys
from PyQt5 import QtCore, QtWidgets, QtMultimedia, QtMultimediaWidgets

class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.video = QtMultimediaWidgets.QVideoWidget()
self.player = QtMultimedia.QMediaPlayer()
self.player.setVideoOutput(self.video)
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.video)
self.player.positionChanged.connect(self.handlePositionChanged)
self.player.mediaStatusChanged.connect(self.handleMediaStateChanged)

def addMedia(self, path, clips):
self._index = -1
self._clips = clips
self.player.setMedia(
QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(path)))

def playNext(self):
self.player.pause()
self._index += 1
if 0 <= self._index < len(self._clips):
self.player.setPosition(self._clips[self._index][0])
self.player.play()

def handlePositionChanged(self, pos):
if (0 <= self._index < len(self._clips) and
pos > self._clips[self._index][1] and
self.player.state() == QtMultimedia.QMediaPlayer.PlayingState):
self.playNext()

def handleMediaStateChanged(self, state):
if state == QtMultimedia.QMediaPlayer.LoadedMedia:
self.playNext()

app = QtWidgets.QApplication(sys.argv)
window = Window()
window.addMedia(sys.argv[1], [[2000, 4000], [10000, 15000]])
# window.addMedia(sys.argv[1], [[10000, 20000], [40000, 50000]])
window.show()
sys.exit(app.exec_())

关于python - 如何依次播放视频的多个片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54416396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com