Pyqt phonon的使用

本文是用Pyqt实现了下网上一个Qt版大牛关于phonon的介绍

Qt phonon地址:http://wenku.baidu.com/link?url=nH_dZ8lZbXHy8N5__8jAWLXcuMYf4yRjdCK8Z4y3gm6PX0qPTUVqQnMHgq-v-z2QQShQYbMOa7b0XULtpF0okFs5HczwzwLy2Zfy39UpMH_

前言 

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,就是使用套件管理工具来从套件包来安装,只需要安装下列的套件:

1 sudo apt-get install libphonon-dev libphonon4 phononbackend-gstreamer

安装完毕之后,就可以使用Phono模组罗。

而与其他Qt应用程式一样,若有使用到Phonon函式库的应用程式在build的时候都需要额外设定使用Phonon模组,必须要在qmaek project file中加入:

1 QT += phonon

使用 

在此部分将会开始介绍如何使用Phonon这套函式库,并且会列出一些小范例来demo,首先就先来介绍几个简单好用的类别。

VideoPlayer Class 

Phonon有提供很多类别可供使用,其中最简单的,莫过於VideoPlayer这个类别了。 VideoPlayer widget如它的名字一样,就是用来播放video,而且使用起来相当简易,而且功能也不会缺少,包括播放、暂停与停止。

而一开始早先提到的MediaObject等类别与VideoPlayer在使用上有什么差异呢?如果不需要更复杂的功能,例如建立一个media graph,你只需要能够播放影音档案的话,其实使用VideoPlayer类别即可达到你的要求。 而另外值得一提的就是,VideoPlayer大部分函式都是非同步,所以载入media source并不会马上播放多媒体档案,只有在呼叫函式play( )之后才会播放。

要怎么使用这个类别呢? 其实相当简单,下面就是程式码片段:

1 player = Phonon.VideoPlayer(Phonon.VideoCategory, self)
2 player.play(url)

在实体化VideoPlayer类别物件时,可以在constructor就载入多媒体种类与要放在哪个widget中(即为 parentWidget),而media source可以利用函式load()来载入或是在play()时载入,而载入方式可直接从档案或是从网路位址。

以下就是一个简单的影音播放功能小程式:

1 from PyQt4 import QtCore, QtGui
 2 from PyQt4.phonon import *
 3 import sys
 4 
 5 
 6 
 7 
 8 if __name__ == "__main__":
 9     app = QtGui.QApplication(sys.argv)
10     videofrom = QtGui.QWidget()
11     videofrom.setWindowTitle('Video Player')
12     videofrom.resize(400,400)
13     player = Phonon.VideoPlayer(Phonon.VideoCategory, videofrom)
14     player.load(Phonon.MediaSource('aa.mp3'))
15     player.play()
16     videofrom.show()
17     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():停止播放 

以下为一个简单的程式片段,说明如何使用:

1 self.mediaObject = phonon.Phonon.MediaObject(self)
2 self.videoWidget =phonon.Phonon.VideoWidget(self)
3 phonon.Phonon.createPath(self.mediaObject, self.videoWidget)
4 self.audioOutput  =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
5 phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
6 self.mediaObject.play()

Phonon.createPath() 

这是相当重要的一个函数,主要用於建立一个Path,连接两个MediaNodes,就是source与sink。 其实它的主要用途是在更进阶的部分,就是在使用到media graph,不过如果只是利用Phonon来播放多媒体影音档,其实只要记得它是用来连接source与输出装置即可。

AudioOutput Class 

AudioOutput类别主要是用来把多媒体的声音送到声音输出装置。所以它能够经由类似喇叭等输出装置来播放声音,稍早有提过,多媒体资料的来源必须要经过Phonon::createPath()由MediaObject连接。

1         file = self.addFiles('audio')3         self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(file))
4         self.audioOutput  =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
5         phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
6         self.mediaObject.play()

参考方法:

1 def openaudio(self):
2         file = self.addFiles('audio')
3         self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(file))
4         self.audioOutput  =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
5         phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
6         self.mediaObject.play()

VideoWidget Class 

VideoWidget类别提供能够显示出影片的widget。

VideoWidget类别会在QWidget上播放多媒体串流的影像,跟AudioOutput一样,必须使用 Phonon.createPath()来与MediaObject连接。你可以利用一些函式来控制在QWidget中的VideoWidget显示的大小,你可以利用setAspectRatio()或setScaleMode()来控制,而它们接收的参数可以到网站上察看,使用方式如下(预设是使用 aspect ratio):

1 videowidget.setAspectRatio(Phonon.VideoWidget.AspectRatioAuto)
2 videowidget.setScaleMode(Phonon.VideoWidget.ScaleAndCrop)

参考方法体:

1 def openvideo(self):
2         file = self.addFiles('video')
3         self.videoWidget =phonon.Phonon.VideoWidget(self)
4         self.mediaObject.setCurrentSource(phonon.Phonon.MediaSource(file))
5         self.audioOutput  =phonon.Phonon.AudioOutput(phonon.Phonon.VideoCategory, self)
6         phonon.Phonon.createPath(self.mediaObject, self.audioOutput)
7         self.mediaObject.play()

当然也有提供函式让影片进入或退出全屏幕模式。以下为一个简短的程式码范例:

1 media = Phonon.MediaObject(parent)
2 vwidget = Phonon.VideoWidget(parent)
3 Phonon.createPath(media, vwidget)

SeekSlider Class 

SeekSlider类别提供一个可滑动的slider来设定多媒体串流播放的位置。所以它会连接到MediaObject,并控制串流目前的位置。

以下是一个使用的范例:

1 moo =  Phonon.MediaObject()
2 device = Phonon.AudioOutput()
3 Phonon.createPath(moo, device)
4 moo.setCurrentSource(QString("/home/gvatteka/Music/Lumme-Badloop.ogg"))
5 slider = Phonon.SeekSlider
6 slider.setMediaObject(moo)
7 slider.show()
8 moo.play()

VolumeSlider Class 

VolumeSlider widget提供可以控制声音装置音量的widget。

用法其实与上面的SeekSlider类似,使用范例如下:

1 mediaObject = Phonon.MediaObject()
2 audioOutput = Phonon.AudioOutput(Phonon.MusicCategory)
3 Phonon.createPath(mediaObject, audioOutput)
4 volumeSlider =Phonon.VolumeSlider
5 volumeSlider.setAudioOutput(audioOutput)

范例 

再看过上面的一些类别介绍之后,其实就可以显一个简单的媒体播放器了,请看范例程式码:

1 from PyQt4 import QtCore, QtGui
 2 from PyQt4.phonon import *
 3 import sys
 4 
 5 if __name__ == "__main__":
 6     app = QtGui.QApplication(sys.argv)
 7     videofrom = QtGui.QWidget()
 8     videofrom.setWindowTitle('Video Player')
 9     videofrom.resize(400,400)
10     media = Phonon.MediaObject()
11     media.setCurrentSource(Phonon.MediaSource('../cn.avi'))
12 
13     vwidget = Phonon.VideoWidget(videofrom)
14     Phonon.createPath(media, vwidget)
15 
16     vwidget.setAspectRatio(Phonon.VideoWidget.AspectRatioAuto)
17     aOutput = Phonon.AudioOutput(Phonon.VideoCategory)
18     Phonon.createPath(media, aOutput)
19 
20     labe = QtGui.QLabel('Volume:')
21     volumeSlider = Phonon.VolumeSlider()
22     volumeSlider.setAudioOutput(aOutput)
23     volumeSlider.setSizePolicy(QtGui.QSizePolicy.Maximum, QtGui.QSizePolicy.Maximum)
24 
25     seekSlider = Phonon.SeekSlider()
26     seekSlider.setMediaObject(media)
27 
28     hLayout = QtGui.QHBoxLayout()
29     hLayout.addWidget(labe)
30     hLayout.addWidget(volumeSlider)
31     hLayout.addStretch()
32 
33     vLayout = QtGui.QVBoxLayout()
34     vLayout.addWidget(vwidget)
35     vLayout.addWidget(seekSlider)
36     vLayout.addLayout(hLayout)
37     videofrom.setLayout(vLayout)
38 
39     videofrom.show()
40     media.play()
41 
42     sys.exit(app.exec_())

由于 VideoWidget已经嵌入到QWidget了,所以你调整视窗大小的话,影片播放的视窗也会跟著调整

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Qt学习之路_14(简易音乐播放器)

      这一节实现一个简易的音乐播放器,其音乐播放的核心功能是采用Qt支持的Phonon框架,该框架在前一篇博文Qt学习之路_13(简易俄罗斯方块) 中已经使用过...

    bear_fish
  • Qt学习之路_14(简易音乐播放器)

    http://www.cnblogs.com/tornadomeet/archive/2012/09/23/2699077.html

    bear_fish
  • 网易2011笔试题详解

    http://blog.csdn.net/silangquan/article/details/18051675

    bear_fish
  • Python金融大数据分析-正态性检验

    我们在线性回归做假设检验,在时间序列分析做自回归检验,那么我们如何检验一个分布是否是正态分布的呢? 首先,我们定义一个用来生成价格路径的函数。当然啦,在这之前...

    钱塘小甲子
  • 云游西湖·洞察智能 2017腾讯“云+俱乐部”西湖老友记

    寒灯新茗同月煎,浅瓯煮雪茶情深。2017年12月15日,腾讯“云+俱乐部”以“云游西湖 · 洞察智能”为主题,邀请来自业内的多家公司创始人/CTO等在茶香缭绕中...

    Lindsay
  • Tensorflow 之RNNinputs: shape = (batch_size, time_steps, input_size)cell: RNNCellinitial_state: shape

    output = np.reshape(aa, [-1,5]) -1表示一个占位符,分为5列。

    微风、掠过
  • 腾讯与中南民族大学签署战略合作协议 致力打造智慧校园新标杆、探索人才培养新模式

    ? 近日,腾讯与中南民族大学战略合作签约仪式在中南民族大学国际学术会议中心举行。未来,双方将联手探索新工科创新人才培养、智慧校园建设等,共同探索产教融合、校企...

    腾讯智慧教育
  • 让你的 git 拥有不同身份

    由于你没有进行过特别的设定,所以 git不管它是往 github上传还是往你公司的服务器上传,都会以一个完全相同的身份上传,这有时候会造成困扰,比如说这样: ?...

    程序员宝库
  • 开放协作,腾讯技术大变身

    2020 年 3 月 9 日,腾讯公司正式对外发布了《腾讯研发大数据报告》。在这份报告中,腾讯披露了2019 年公司在产品及技术研发方面的重要数据,这也是腾讯自...

    技术改变世界
  • CIOE 2020 | 腾讯开放光网络平台首次亮相 重磅发布光层和电层两款相关新品

    摘要:CIOE 2020,腾讯开放光网络平台TOOP(Tencnet Open Optical Platform)首次亮相,向业界展示了腾讯云在数据中心互联方...

    鹅厂网事

扫码关注云+社区

领取腾讯云代金券