如何用Qt4声子播放youtube视频?

时间:2014-05-25 13:05:25

标签: python qt pyqt4 phonon youtube-dl

我想要一个简单的youtube客户端,播放youtube视频,并使用Python和Qt4声子列出按视图计数排序的视频。
我还安装了youtube-dl来获取视频的网址。

我发现了一个很好的example of PyQt4.phonon,通过这个例子,我可以播放我的高清和其他网站的视频,但无法播放来自youtube的视频(我在播放器上看不到任何内容,但终端也没有)。

我正在使用 Python2.7.6 / Python3.4.0 PyQt4 youtube_dl-2014.05.19

我错过了播放youtube视频的内容吗?或者我的代码有问题?

提前致谢。

我的代码:

#!/usr/bin/python

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.phonon import Phonon
from PyQt4 import phonon
import sys
import youtube_dl

def get_video_url(url):
    ydl = youtube_dl.YoutubeDL({'outtmpl': '%(id)s%(ext)s'})
    ydl.add_default_info_extractors()

    result = ydl.extract_info(url, download=False)
    if 'entries' in result:
        video = result['entries'][0]
    else:
        video = result
    return video['url']


class QPlayer(QWidget):
    def __init__(self):
        super(QPlayer, self).__init__()
        self.audioOuptut=Phonon.AudioOutput(Phonon.MusicCategory, self)
        self.player=Phonon.MediaObject(self)
        Phonon.createPath(self.player, self.audioOuptut)

        self.videoWidget=Phonon.VideoWidget(self)
        Phonon.createPath(self.player, self.videoWidget)

        self.player.setTickInterval(1000)
        self.connect(self.player, SIGNAL("tick(qint64)"), self.tick)

        self.seekSlider=Phonon.SeekSlider(self.player, self)
        self.volumeSlider=Phonon.VolumeSlider(self.audioOuptut, self)

        self.buildGUI()
        self.setupConnections()

    def buildGUI(self):

        self.fileLabel = QLabel("File")
        self.fileEdit = QLineEdit()
        self.fileLabel.setBuddy(self.fileEdit)

        self.lcdTimer=QLCDNumber()
        self.lcdTimer.display("00:00")

        self.browseButton=QPushButton("Browse")
        self.browseButton.setIcon(QIcon(":/images/folder-music.png"))

        self.playButton=QPushButton("Play")
        self.playButton.setIcon(QIcon(":/images/play.png"))
        self.playButton.setEnabled(False)

        self.pauseButton=QPushButton("Pause")
        self.pauseButton.setIcon(QIcon(":/images/pause.png"))

        self.stopButton=QPushButton("Stop")
        self.stopButton.setIcon(QIcon(":/images/stop.png"))

        upperLayout=QHBoxLayout()
        upperLayout.addWidget(self.fileLabel)
        upperLayout.addWidget(self.fileEdit)
        upperLayout.addWidget(self.browseButton)

        midLayout=QHBoxLayout()
        midLayout.addWidget(self.seekSlider)
        midLayout.addWidget(self.lcdTimer)

        lowerLayout=QHBoxLayout()
        lowerLayout.addWidget(self.playButton)
        lowerLayout.addWidget(self.pauseButton)
        lowerLayout.addWidget(self.stopButton)
        lowerLayout.addWidget(self.volumeSlider)

        layout=QVBoxLayout()
        layout.addLayout(upperLayout)
        layout.addWidget(self.videoWidget)
        layout.addLayout(midLayout)
        layout.addLayout(lowerLayout)

        self.setLayout(layout)
        self.lcdTimer.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        self.seekSlider.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        self.volumeSlider.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)


    def setupConnections(self):
        self.connect(self.browseButton, SIGNAL("clicked()"), self.browseClicked)
        self.connect(self.playButton, SIGNAL("clicked()"), self.playClicked)#self.playClicked)
        self.connect(self.pauseButton, SIGNAL("clicked()"), self.pauseClicked)
        self.connect(self.stopButton, SIGNAL("clicked()"), self.stopClicked)
        self.connect(self.fileEdit, SIGNAL("textChanged(const QString&)"), self.checkFileName)

    def tick(self, time):
        displayTime = QTime(0, (time / 60000) % 60, (time / 1000) % 60)
        self.lcdTimer.display(displayTime.toString('mm:ss'))

    def playClicked(self):
        self.player.setCurrentSource(Phonon.MediaSource(self.fileEdit.text()))
        self.player.play()

    def pauseClicked(self):
        self.player.pause()

    def stopClicked(self):
        self.player.stop()
        self.lcdTimer.display("00:00")

    def browseClicked(self):
        f=QFileDialog.getOpenFileName(self)
        if not f.isEmpty():
            self.fileEdit.setText(f)

    def checkFileName(self, s):
        if not s.isEmpty():
            self.playButton.setEnabled(True)
        else:
            self.playButton.setEnabled(False)

app = QApplication(sys.argv)
q = QPlayer()
q.player.setCurrentSource(Phonon.MediaSource(get_video_url("[video URL (https://www.youtube.com/watch?v=...)]")))
q.player.play()
q.show()
app.exec_()

在终端:

~$ python phonon.py
Got bus address:  "unix:abstract=/tmp/dbus-ErjaxLIFi4,guid=7055ff4ff81492c67a9c642153814399" 
Connected to accessibility bus at:  "unix:abstract=/tmp/dbus-ErjaxLIFi4,guid=7055ff4ff81492c67a9c642153814399" 
Registered DEC:  true 
[youtube] Setting language
[youtube] ***: Downloading webpage
[youtube] ***: Downloading video info webpage
[youtube] ***: Extracting video information
Registered event listener change listener:  true 

0 个答案:

没有答案