Я пытаюсь использовать 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_())
Ваш пример отлично подходит для меня в Linux и WinXP при потоковой передаче звука. Похоже, это может быть проблемой с вашей конкретной настройкой. – ekhumoro
Мой друг пытался на Linux и не работал. Что вы имеете в виду с конкретной настройкой? Ваша ОС 32 или 64 бит? Какой дистрибутив Linux вы использовали? Спасибо за отзыв. Я расстраивался. –
«Не работает», вы имеете в виду, что ваш друг получил _exact ту же ошибку_, или что именно? Конкретная настройка означает версии PyQt, Qt и т. Д., Которые вы используете, но также может включать в себя вашу конфигурацию сети. (PS: Я тестировал Arch Linux). – ekhumoro