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了,所以你調整視窗大小的話,影片播放的視窗也會跟著調整


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM