Pyqt phonon的使用
本文是用Pyqt实现了下网上一个Qt版大牛关于phonon的介绍
翻译如下:
---------------------------***********************---------------------------------------------------------------------------
前言
Phonon严格来说其实非为Qt的library,Phonon原本就是KDE 4的开放原始码多媒体API,后来与Qt合并与开发,所以简单来说就是Qt使用Phonon这个多媒体框架来提供一般影音多媒体档案的播放,而这些影音多媒体来源可以是档案、网路串流或是指到一个档案的QUrl。
Phonon是一个跨平台多媒体框架,能够在Qt应用程式中使用与播放影音多媒体内容。
Phonon的架构
整体来说,Phonon的架构只需要记住以下的三东西:
media object
Phonon的基础,用於管理多媒体来源。来源可能是影音档等,而能够提供基本的播放控制,例如开始、暂停或结束。而提供多媒体资料给media object的则为media source,在给media object之前通常是raw data,再由media object进行转换。
sinks
输出多媒体,例如在widget上播放影片或是输出至音效卡(播放音乐)。通常sink是一个播放的装置(例如音效卡等)。而sink只接受media object来的资料,由media object控制播放;而由sink来处理这些多媒体 。
paths
用来连接Phonon的物件,意即media object与sink之间的连接。
可从下图看出彼此的关系(资料来源:Phonon Overview):

所以整个播放影音的流程就是首先由media object开始播放,接著把媒体串流经由path送至sink,sink会经由音效卡等装置重新播放(play back)影音。
安装
QtSoftware官方网站是说Phonon预设会跟在安装Qt时一并安装,不过我不论是从Qt SDK或从source code重新build,都没有包含Phonon模组,目前我是用另外一种方式来安装Phonon,就是使用套件管理工具来从套件包来安装,只需要安装下列的套件:
sudo apt-get install libphonon-dev libphonon4 phononbackend-gstreamer
安装完毕之后,就可以使用Phono模组罗。
而与其他Qt应用程式一样,若有使用到Phonon函式库的应用程式在build的时候都需要额外设定使用Phonon模组,必须要在qmaek project file中加入:
QT += phonon
使用
在此部分将会开始介绍如何使用Phonon这套函式库,并且会列出一些小范例来demo,首先就先来介绍几个简单好用的类别。
VideoPlayer Class
Phonon有提供很多类别可供使用,其中最简单的,莫过於VideoPlayer这个类别了。
VideoPlayer widget如它的名字一样,就是用来播放video,而且使用起来相当简易,而且功能也不会缺少,包括播放、暂停与停止。
而一开始早先提到的MediaObject等类别与VideoPlayer在使用上有什么差异呢?如果不需要更复杂的功能,例如建立一个media graph,你只需要能够播放影音档案的话,其实使用VideoPlayer类别即可达到你的要求。
而另外值得一提的就是,VideoPlayer大部分函式都是非同步,所以载入media source并不会马上播放多媒体档案,只有在呼叫函式play( )之后才会播放。
要怎么使用这个类别呢? 其实相当简单,下面就是程式码片段:
player = Phonon.VideoPlayer(Phonon.VideoCategory, self)
player.play(url)
在实体化VideoPlayer类别物件时,可以在constructor就载入多媒体种类与要放在哪个widget中(即为 parentWidget),而media source可以利用函式load()来载入或是在play()时载入,而载入方式可直接从档案或是从网路位址。
以下就是一个简单的影音播放功能小程式:
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import *
import sys if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
videofrom = QtGui.QWidget()
videofrom.setWindowTitle('Video Player')
videofrom.resize(400,400)
player = Phonon.VideoPlayer(Phonon.VideoCategory, videofrom)
player.load(Phonon.MediaSource('aa.mp3'))
player.play()
videofrom.show()
sys.exit(app.exec_())
MediaObject Class
MediaObject类别主要提供一个能够处理媒体播放的介面。
MediaObject可说是处理多媒体档案最基本的一部份,它接受并管理来自於MediaSource的媒体档案。而媒体播放、暂停与停止都是由它来控制;而在此之前,media物件必须要与output node连接,如早先所讲的,这个nodes主要将媒体输出至底层的硬体,例如音效卡或显示卡等,而所需要的output node则是根据多媒体的内容而所不同,目前Phonon有两种output node
AudioOutput-声音播放
VideoWidget-影像播放
如果MediaSource包含声音与影像的话,这两种node都必须要连接至media物件。
就这个类别来说,有几个函式是你必须要知道的,分别是
setCurrentSource():设定MediaObject的多媒体来源,而来源可以是网路上的影音档(利用QUrl来存取)或是本机档案(利用QString),使用上相当简单:QUrl url("http://www.example.com/music.ogg");media.setCurrentSource(url);
play():开始播放多媒体资料
pause():暂停播放
stop():停止播放
以下为一个简单的程式片段,说明如何使用:
self.mediaObject = phonon.Phonon.MediaObject(self)
self.videoWidget =phonon.Phonon.VideoWidget(self)
phonon.Phonon.createPath(self.mediaObject, self.videoWidget)
self.audioOutput =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
self.mediaObject.play()
Phonon.createPath()
这是相当重要的一个函数,主要用於建立一个Path,连接两个MediaNodes,就是source与sink。
其实它的主要用途是在更进阶的部分,就是在使用到media graph,不过如果只是利用Phonon来播放多媒体影音档,其实只要记得它是用来连接source与输出装置即可。
AudioOutput Class
AudioOutput类别主要是用来把多媒体的声音送到声音输出装置。所以它能够经由类似喇叭等输出装置来播放声音,稍早有提过,多媒体资料的来源必须要经过Phonon::createPath()由MediaObject连接。
file = self.addFiles('audio') self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(file))
self.audioOutput =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
self.mediaObject.play()
参考方法:
def openaudio(self):
file = self.addFiles('audio')
self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(file))
self.audioOutput =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
self.mediaObject.play()
VideoWidget Class
VideoWidget类别提供能够显示出影片的widget。
VideoWidget类别会在QWidget上播放多媒体串流的影像,跟AudioOutput一样,必须使用 Phonon.createPath()来与MediaObject连接。你可以利用一些函式来控制在QWidget中的VideoWidget显示的大小,你可以利用setAspectRatio()或setScaleMode()来控制,而它们接收的参数可以到网站上察看,使用方式如下(预设是使用 aspect ratio):
videowidget.setAspectRatio(Phonon.VideoWidget.AspectRatioAuto)
videowidget.setScaleMode(Phonon.VideoWidget.ScaleAndCrop)
参考方法体:
def openvideo(self):
file = self.addFiles('video')
self.videoWidget =phonon.Phonon.VideoWidget(self)
self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(file))
self.audioOutput =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
self.mediaObject.play()
当然也有提供函式让影片进入或退出全屏幕模式。以下为一个简短的程式码范例:
media = Phonon.MediaObject(parent)
vwidget = Phonon.VideoWidget(parent)
Phonon.createPath(media, vwidget)
SeekSlider Class
SeekSlider类别提供一个可滑动的slider来设定多媒体串流播放的位置。所以它会连接到MediaObject,并控制串流目前的位置。
以下是一个使用的范例:
moo = Phonon.MediaObject()
device = Phonon.AudioOutput()
Phonon.createPath(moo, device)
moo.setCurrentSource(QString("/home/gvatteka/Music/Lumme-Badloop.ogg"))
slider = Phonon.SeekSlider
slider.setMediaObject(moo)
slider.show()
moo.play()
VolumeSlider Class
VolumeSlider widget提供可以控制声音装置音量的widget。
用法其实与上面的SeekSlider类似,使用范例如下:
mediaObject = Phonon.MediaObject()
audioOutput = Phonon.AudioOutput(Phonon.MusicCategory)
Phonon.createPath(mediaObject, audioOutput)
volumeSlider =Phonon.VolumeSlider
volumeSlider.setAudioOutput(audioOutput)
范例
再看过上面的一些类别介绍之后,其实就可以显一个简单的媒体播放器了,请看范例程式码:
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import *
import sys if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
videofrom = QtGui.QWidget()
videofrom.setWindowTitle('Video Player')
videofrom.resize(400,400)
media = Phonon.MediaObject()
media.setCurrentSource(Phonon.MediaSource('../cn.avi')) vwidget = Phonon.VideoWidget(videofrom)
Phonon.createPath(media, vwidget) vwidget.setAspectRatio(Phonon.VideoWidget.AspectRatioAuto)
aOutput = Phonon.AudioOutput(Phonon.VideoCategory)
Phonon.createPath(media, aOutput) labe = QtGui.QLabel('Volume:')
volumeSlider = Phonon.VolumeSlider()
volumeSlider.setAudioOutput(aOutput)
volumeSlider.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum) seekSlider = Phonon.SeekSlider()
seekSlider.setMediaObject(media) hLayout = QtGui.QHBoxLayout()
hLayout.addWidget(labe)
hLayout.addWidget(volumeSlider)
hLayout.addStretch() vLayout = QtGui.QVBoxLayout()
vLayout.addWidget(vwidget)
vLayout.addWidget(seekSlider)
vLayout.addLayout(hLayout)
videofrom.setLayout(vLayout) videofrom.show()
media.play() sys.exit(app.exec_())

由于 VideoWidget已经嵌入到QWidget了,所以你调整视窗大小的话,影片播放的视窗也会跟著调整
Pyqt phonon的使用的更多相关文章
- Python应用03 使用PyQT制作视频播放器
作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/ ...
- PyQt类库介绍
安装完PyQt后我们去看看这个库里面有些什么cd /usr/lib/python3/dist-packages/PyQt5/ && ls都是些.so的动态链接库,这就是为什么我们在安 ...
- Pyqt 音视频播放器
在寻找如何使用Pyqt做一个播放器时首先找到的是openCV2 openCV2 貌似太强大了,各种关于图像处理的事情它都能完成,如 读取摄像头.图像识别.人脸识别. 图像灰度处理 . 播放视频等,强 ...
- PyQT制作视频播放器
Python应用03 使用PyQT制作视频播放器 作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁任何形式转载. 最近研究了Python的两个GUI包,Tki ...
- Python编程使用PyQT制作视频播放器
最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...
- arcpy+PyQt+py2exe快速开发桌面端ArcGIS应用程序
前段时间有一个项目,大体是要做一个GIS数据处理工具. 一般的方法是基于ArcObjects来进行开发,因为我对ArcObjects不太熟悉,所以就思考有没有其他简单快速的方法来做. 在查看ArcGI ...
- Pyqt 基础功能
总结Pyqt的基础知识 1. Pyqt 设置禁止最大化及禁止拖拽窗口大小 # PyQT禁止窗口最大化按钮: self.setWindowFlags(QtCore.Qt.WindowMinimizeB ...
- 模拟提交API数据Pyqt版
其实这个模拟提交数据之前已经写过篇: Python requests模拟登录 因为现在在做的项目中需要一个debug请求调试API,用PHP的CURL写了一个,又因Pyqt更能直观灵活的显示请求的参数 ...
- pyqt的信号槽机制(转)
PySide/PyQt Tutorial: Creating Your Own Signals and Slots This article is part 5 of 8 in the series ...
随机推荐
- Graphic32中TBitmap32.TextOut性能分析[转载]
转载:http://blog.csdn.net/avan_lau/article/details/6958497 最近在分析软件中画线效率问题,发现在画一些标志性符号的方法,存在瓶颈,占用较大的时间. ...
- win8_64下安装paramiko
win8_64下安装paramiko C:\Python35\Scripts>easy_install paramiko 提示 C:\Python35\Scripts>python Pyt ...
- django ATOMIC_REQUESTS
在数据库配置中,如果配置了此属性为True,如下: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.xxx', 'NAME': '', ...
- zend studio 10.6 汉化破解
破解方法: 1.zend studio 10.6下载:百度网盘 2.zend 破解文件下载:百度网盘 3.安装完zend后不要运行,将下载的破解文件复制替换到plugins文件夹下 4.然后在选择完w ...
- 2017/1/7 学习笔记 jar包,maven
① 关于tar,jar,war文件 tar是通用的另一种打包格式,为了部署到服务器时方便. jar是java app server识别的java部署格式,其实是Zip文件,只是内部的文件有规范. wa ...
- ConsoleApplication 添加对于 System.ServiceModel.Web 引用失败(出现黄色感叹号)的解决办法
今天在写一个WebHttpBinding的demo,再创建一个Console应用程序后,发现无法添加System.ServiceModel.Web,如图
- cf592d
题意:给出一个无根树,点数为10^5,所有边的长度为1.给定其中有一些点是受到攻击的. 现在要求一个人选定一个点作为起点,走遍所有的受攻击点(不用再回到起点). 需要的最短距离是多少,选定的起点是哪个 ...
- AC自动机题目汇总
POJ 4052 ZJU 3430 HDU 4117 HNU 10104 HDU 2457 HNU 11187 ZJU 3545 HDU 3341
- Linux-PAM认证模块
Linux-PAM认证模块 用户访问服务器的时候,服务器的某一个服务程序把用户的谁请求发送到PAM模块进行认证.对于不同的服务器应用程序所对应的PAM模块也是不同的.如果想查看某个程序是否支持 ...
- percona-toolkit 之 【pt-slave-delay】说明
摘要: 在主从复制的架构中,正常情况下主上操作的记录也会在从上进行操作,虽说是异步复制,但操作会“实时”的同步到从.比如在主上不小心误操作了,还没等反应过来从上也会马上执行误操作,后期只有通过二进制或 ...