Calificación:
  • 1 voto(s) - 1 Media
  • 1
  • 2
  • 3
  • 4
  • 5
no service found for - "org.qt-project.qt.mediaplayer"
#1
Hola, tengo un problema para tocar sonido con pyqt5 y python 3. En python 2.7 y pyqt4 ya tengo buen sonido usando phonon pero al usar el ejemplo para pyqt5 y python3 de https://recursospython.com/codigos-de-fu...eo-pyqt-4/ pues resulta que me sale el error:

defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer"

Lo que quiero es pasar un tetris multijugador que tengo para jugar con mis hijas de python2 y qt4 a python3 y qt5, pueden ver la versión para py2 y qt4 en: http://guillermo.molleda.com/Tetris9_py2qt4.7z

Gracias.
Responder
#2
Hola, ¿cómo estás?

¿Estás corriendo tu código en Windows o Linux? ¿Compilaste Qt por tu cuenta?

Saludos
Responder
#3
Hola de nuevo.
Estoy en Linux (LinuxMint19 basada en Ubuntu 18.04, con XFCE), he instalado cosas por pip (sudo -H pip install ...) y por synaptic (o sudo apt-get install ...)
Que recuerde:
sudo -H pip3 install pyqt5
sudo apt-get install qttools5-dev-tools
Y mirando por internet, cada uno dice que instale una cosa, ya llevo:
sudo apt-get install python3-pyqt5.qtmultimedia qtmultimedia5-dev libqt5multimedia5-plugins gstreamer1.0-qt5 qtgstreamer-plugins-qt5 gstreamer1.0-python3-plugin-loader qml-module-qtmultimedia qml-module-qt-labs-folderlistmodel libqt5gstreamer-1.0-0 libqt5gstreamer-dev
Pero ejecutando el código de https://recursospython.com/codigos-de-fu...eo-pyqt-4/ (escojo el de pyqt5) y usando como fichero avi uno de ejemplo de internet (http://techslides.com/sample-files-for-development) sigue saliendo el mismo error.
He instalado por probar también qt4 y phonon y me funciona bien mi versión antigua del juego (con sonido).
En python3 y qt5 me funciona mi juego tetris pero sin música que le tengo que agregar, pero para ello primero tengo que conseguir hacerlo funcionar con el programa del reproductor de ejemplo.
Responder
#4
Por ejemplo este código sí me produce un sonido: subir volumen, variar el tono (Pitch) si se quiere y pulsar el botón play:


Código:
#!/usr/bin/python3

from math import pi, sin
import struct, sys

from PyQt5.QtCore import QBuffer, QByteArray, QIODevice, Qt
from PyQt5.QtWidgets import (QApplication, QFormLayout, QLineEdit, QHBoxLayout,
                       QPushButton, QSlider, QVBoxLayout, QWidget)
from PyQt5.QtMultimedia import QAudio, QAudioDeviceInfo, QAudioFormat, QAudioOutput

class Window(QWidget):

   def __init__(self, parent = None):
   
       QWidget.__init__(self, parent)
       
       format = QAudioFormat()
       format.setChannelCount(1)
       format.setSampleRate(22050)
       format.setSampleSize(16)
       format.setCodec("audio/pcm")
       format.setByteOrder(QAudioFormat.LittleEndian)
       format.setSampleType(QAudioFormat.SignedInt)
       self.output = QAudioOutput(format, self)
       
       self.frequency = 440
       self.volume = 0
       self.buffer = QBuffer()
       self.data = QByteArray()
       
       self.deviceLineEdit = QLineEdit()
       self.deviceLineEdit.setReadOnly(True)
       self.deviceLineEdit.setText(QAudioDeviceInfo.defaultOutputDevice().deviceName())
       
       self.pitchSlider = QSlider(Qt.Horizontal)
       self.pitchSlider.setMaximum(100)
       self.volumeSlider = QSlider(Qt.Horizontal)
       self.volumeSlider.setMaximum(32767)
       self.volumeSlider.setPageStep(1024)
       
       self.playButton = QPushButton(self.tr("&Play"))
       
       self.pitchSlider.valueChanged.connect(self.changeFrequency)
       self.volumeSlider.valueChanged.connect(self.changeVolume)
       self.playButton.clicked.connect(self.play)
       
       formLayout = QFormLayout()
       formLayout.addRow(self.tr("Device:"), self.deviceLineEdit)
       formLayout.addRow(self.tr("P&itch:"), self.pitchSlider)
       formLayout.addRow(self.tr("&Volume:"), self.volumeSlider)
       
       buttonLayout = QVBoxLayout()
       buttonLayout.addWidget(self.playButton)
       buttonLayout.addStretch()
       
       horizontalLayout = QHBoxLayout(self)
       horizontalLayout.addLayout(formLayout)
       horizontalLayout.addLayout(buttonLayout)
   
   def changeFrequency(self, value):
   
       self.frequency = 440 + (value * 2)
   
   def play(self):
   
       if self.output.state() == QAudio.ActiveState:
           self.output.stop()
       
       if self.buffer.isOpen():
           self.buffer.close()
       
       self.createData()
       
       self.buffer.setData(self.data)
       self.buffer.open(QIODevice.ReadOnly)
       self.buffer.seek(0)
       
       self.output.start(self.buffer)
   
   def changeVolume(self, value):
   
       self.volume = value
   
   def createData(self):
   
       # Create 2 seconds of data with 22050 samples per second, each sample
       # being 16 bits (2 bytes).
       
       self.data.clear()
       for i in range(2 * 22050):
           t = i / 22050.0
           value = int(self.volume * sin(2 * pi * self.frequency * t))
           self.data.append(struct.pack("<h", value))


if __name__ == "__main__":

   app = QApplication(sys.argv)
   window = Window()
   window.show()
   sys.exit(app.exec_())
Esto no me sirve porque no puedo leer un fichero mp3, he leído que lo pasan a wav pero eso ocupa mucho más y no lo veo adecuado para tocar una música tipo mp3, sí podría ser para tocar efectos de un juego (rebote, disparo, ...)

Este otro código bien cortito cogido de otro lado para tocar un mp3 también sale con el error:
Código:
#!/usr/bin/python3

import sys
import os

from PyQt5 import QtCore
from PyQt5 import QtMultimedia


def play_audio(dialect):
       file_names = {'a': './muziko1', 'b': './muziko2.mp3', 'c': './muziko3.mp3'}
       url = QtCore.QUrl.fromLocalFile(os.path.abspath(file_names[dialect]))
       content = QtMultimedia.QMediaContent(url)
       player = QtMultimedia.QMediaPlayer()
       player.setMedia(content)
       player.play()
       player.stateChanged.connect(lambda: player.disconnect())

if __name__ == "__main__":
       a = play_audio('a')
Salida:
defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer"
Responder
#5
Hola, aquí tienes un hilo del foro de Qt con varias propuestas: https://forum.qt.io/topic/28620/solved-q...aplayer/30.

Puedes chequear instalando GStreamer:

Código:
apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools

También:

Código:
sudo apt-get install qtmultimedia5-examples

Saludos
Responder
#6
Gracias, desde agosto no he tenido ni tiempo de pensar en esto.
El enlace que me pusiste parece ser exclusivo para Windows, aunque es verdad que para linux hacían referencia a instalar paquetes de libgstreamer.
Lo instalé todo pero nada, mismo error y sin música.

Ahora lo tengo así:

import PyQt5.QtMultimedia as M
import sys, os, random
from PyQt5 import QtCore, QtGui

...
y en una función:


def ponerMusica(self):
    print("aaa")
    self.audio_output = M.QMediaPlayer()
    print("bbb")

    url = QtCore.QUrl.fromLocalFile(u"./mimusica.ogg")
    self.audio_output.setMedia(M.QMediaContent(url))
    self.audio_output.play()

y la salida es:
aaa
defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer"
bbb
Responder
#7
Hola. Seguramente creando un tema en el foro de Qt encontrarás un poco más de ayuda.

Saludos
Responder
#8
Gracias, por allí iré.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)