首页 > 解决方案 > PyQt 4.8 Phenon.VideoPlayer 错误的视频状态

问题描述

当我在做一些 python 编程时,我是 PyQt 的新手。我们使用 linux OS (debian) 和 PyQt 4.8 和 python 2.7。

我的任务是让它播放视频。我已经研究了可能性并决定使用 Pheno.VideoPlayer 模块。

过了一会儿,我有了播放视频文件的工作测试脚本:

import sys
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon


# CONST ****************************************************************************************************************

SAMPLE_VIDEO_LOCAL = 'Event-29544-r1-s1.mp4'

SAMPLE_VIDEO_URL_MP4 = 'http://techslides.com/demos/sample-videos/small.mp4'
SAMPLE_VIDEO_URL_WEBM = 'http://techslides.com/demos/sample-videos/small.webm'
SAMPLE_VIDEO_URL_OGV = 'http://techslides.com/demos/sample-videos/small.ogv'
SAMPLE_VIDEO_URL_3GP = 'http://techslides.com/demos/sample-videos/small.3gp'
SAMPLE_VIDEO_URL_FLV = 'http://techslides.com/demos/sample-videos/small.flv'


app = QtGui.QApplication(sys.argv)
vp = Phonon.VideoPlayer()
print "Showing VP"
vp.show()

print "Loading media"
media = Phonon.MediaSource(SAMPLE_VIDEO_LOCAL)
vp.load(media)
mo = vp.mediaObject()
media_state = mo.state()
while media_state == Phonon.LoadingState:
    media_state = mo.state()
    if media_state == Phonon.StoppedState:
        print "Ready to play"
        break
    elif media_state == Phonon.BufferingState:
        print "Buffering data from URL, please wait.."
    elif media_state == Phonon.ErrorState:
        print "Error has occured with media.."
        sys.exit()
    print "Loading.."

vp.setVolume(0.0)
print "Media loaded, playing.."
vp.play()
print "Finished, exitting!"
sys.exit(app.exec_())

这按预期工作。但是,一旦我尝试保持视频运行,检测视频何时停止并再次播放,它就失败了。两种方法

while True:
    print vp.currentTime()
    if vp.isPlaying():
        print "It is playing.."
    else:
        print "Video stopped, playing it again.."
        vp.play()
    time.sleep(1)

while True:
    media_state = mo.state()
    if Phonon.PlayingState:
        continue
    elif media_state == Phonon.StoppedState:
        vp.play()

就像视频停止了一样,但事实并非如此,因为我看到它在我的显示器上运行,并且脚本只是一次又一次地开始它们......直到我杀死它。无论我是从 URL 播放还是本地文件播放,结果都是一样的。

标签: pythonlinuxvideodebianpyqt4

解决方案


GUI的基本规则:你不应该在GUI中使用阻塞任务,在你的情况下while True:,PyQt通过信号通知你某些变量的状态,在这种情况下你应该使用stateChanged信号Phonon::MediaObject

import sys
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon


# CONST ****************************************************************************************************************

SAMPLE_VIDEO_LOCAL = 'Event-29544-r1-s1.mp4'

SAMPLE_VIDEO_URL_MP4 = 'http://techslides.com/demos/sample-videos/small.mp4'
SAMPLE_VIDEO_URL_WEBM = 'http://techslides.com/demos/sample-videos/small.webm'
SAMPLE_VIDEO_URL_OGV = 'http://techslides.com/demos/sample-videos/small.ogv'
SAMPLE_VIDEO_URL_3GP = 'http://techslides.com/demos/sample-videos/small.3gp'
SAMPLE_VIDEO_URL_FLV = 'http://techslides.com/demos/sample-videos/small.flv'



def onStateChanged(newstate, oldState):
    if newstate == Phonon.StoppedState:
        print("Ready to play")
    elif newstate == Phonon.BufferingState:
        print("Buffering data from URL, please wait..")
    elif newstate == Phonon.ErrorState:
        print("Error has occured with media..")
        QtGui.QApplication.quit()
    print("Loading..")


if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    vp = Phonon.VideoPlayer()
    vp.show()
    print("Loading media")
    media = Phonon.MediaSource(SAMPLE_VIDEO_LOCAL)
    vp.load(media)
    mo = vp.mediaObject()
    mo.stateChanged.connect(onStateChanged)
    vp.setVolume(0.0)
    print("Media loaded, playing..")
    vp.play()
    sys.exit(app.exec_())

推荐阅读