2014-01-28 8 views
1

Я пытаюсь использовать PyQt4 и Phonon (на Windows 8 64 бит), чтобы играть песню из интернета (потоковое, напр: http://dr5huvbk6x9di.cloudfront.net/cloudfront_songs/file4.ogg)Как играть песню из Интернета с помощью питона

Чтобы играть песню из файловой системы работает, но когда я пытаюсь играть из Интернета, это не так. Я прочитал документацию, и кажется, все в порядке. Ошибка - это FatalError, поэтому трудно понять, что происходит. Фонон не может воспроизвести песню из Интернета?

Еще один вопрос в том, что я читал, что фонон устарел, и у нас есть PyQt5. Итак, это лучший способ сделать то, что я пытаюсь сделать.

Вот мой код. Это немного грязно, потому что я просто хотел работать, поэтому я мог понять, а затем сделать его лучше. Спасибо

#!/usr/bin/env python 
import sys 
from PyQt4 import QtGui 
from PyQt4 import QtCore 
from PyQt4.phonon import Phonon 

class MainWindow(QtGui.QMainWindow): 

    def __init__(self, win_parent=None): 
     QtGui.QMainWindow.__init__(self, win_parent) 
     self.create_widgets() 

    def create_widgets(self): 
     # Widgets 
     self.label = QtGui.QLabel("ply music player") 
     self.fs_button = QtGui.QPushButton("FileSystem", self) 
     self.ws_button = QtGui.QPushButton("WebStream", self) 

     # Phonon actions 
     self.mediaObject = Phonon.MediaObject(self) 
     self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self) 
     Phonon.createPath(self.mediaObject, self.audioOutput) 

     # Connect signal 
     self.fs_button.clicked.connect(self.on_fs_clicked) 
     self.mediaObject.stateChanged.connect(self.handleStateChanged)  
     self.ws_button.clicked.connect(self.on_ws_clicked) 

     # Vertical layout (manages the layout automatically) 
     v_box = QtGui.QVBoxLayout() 
     v_box.addWidget(self.fs_button) 
     v_box.addWidget(self.ws_button) 

     # Create central widget, add layout and set 
     central_widget = QtGui.QWidget() 
     central_widget.setLayout(v_box) 
     self.setCentralWidget(central_widget) 

    def on_fs_clicked(self): 
     if self.mediaObject.state() == Phonon.PlayingState: 
      self.mediaObject.stop() 
     else: 
      files = QtGui.QFileDialog.getOpenFileNames(self, self.fs_button.text()) 
      if files: 
       songs = [] 
       for file in files: 
        songs.append(Phonon.MediaSource(file)) 
       self.mediaObject.setQueue(songs) 
       self.mediaObject.play() 
       self.fs_button.setText("FileSystem") 

    def handleStateChanged(self, newstate, oldstate): 
     if newstate == Phonon.PlayingState: 
      self.fs_button.setText("Stop") 
     elif newstate == Phonon.StoppedState: 
      self.fs_button.setText("FileSystem") 
     elif newstate == Phonon.ErrorState: 
      source = self.mediaObject.currentSource().fileName() 
      print "ERROR: ", self.mediaObject.errorType() 
      print "ERROR: could not play:", source.toLocal8Bit().data() 


    def on_ws_clicked(self): 
     if self.mediaObject.state() == Phonon.PlayingState: 
      self.mediaObject.stop() 
     else: 
      song = "http://dr5huvbk6x9di.cloudfront.net/cloudfront_songs/file4.ogg" 
      self.mediaObject.setCurrentSource(Phonon.MediaSource(song)) 
      print self.mediaObject.currentSource() 
      self.mediaObject.play() 
      self.ws_button.setText("WebStream") 

if __name__ == "__main__": 
    ply = QtGui.QApplication(sys.argv) 
    ply.setApplicationName("Ply") 
    ply.setQuitOnLastWindowClosed(True) 
    main_window = MainWindow() 
    main_window.show() 
    sys.exit(ply.exec_()) 
+1

Ваш пример отлично подходит для меня в Linux и WinXP при потоковой передаче звука. Похоже, это может быть проблемой с вашей конкретной настройкой. – ekhumoro

+0

Мой друг пытался на Linux и не работал. Что вы имеете в виду с конкретной настройкой? Ваша ОС 32 или 64 бит? Какой дистрибутив Linux вы использовали? Спасибо за отзыв. Я расстраивался. –

+0

«Не работает», вы имеете в виду, что ваш друг получил _exact ту же ошибку_, или что именно? Конкретная настройка означает версии PyQt, Qt и т. Д., Которые вы используете, но также может включать в себя вашу конфигурацию сети. (PS: Я тестировал Arch Linux). – ekhumoro

ответ

0

Ответ на установку кодеков для воспроизведения .ogg файлов. Благодаря @ekhumoro.