python - 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 播放还是本地文件播放,结果都是一样的。
解决方案
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_())
推荐阅读
- animation - 逆向工程 3d 动画浮动压缩
- ruby-on-rails - Rails - 如何配置不同的 s3 上传和下载位置?
- flutter - 如何使 BottomNavigationBar 持久化以及如何在 Flutter 中不重新加载选项卡
- python - 如何将数字添加(不附加)到元组中的现有值?
- json - 使用 JSONDecoder Swift 解码具有整数值的字符串键
- sql - PL/SQL 程序显示指定为“经理”的员工表中员工的详细信息
- java - 测试 CompletableFuture.allOf。加入需要永远
- flutter - 我想使用 willpopscope 代码和我的代码退出后退按钮应用程序
- c++ - C++ for循环更新表达式中的赋值表达式
- elasticsearch - 查询的弹性搜索更新未反映正确更新的文档数量