Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Game Development
  4. How to play sounds using QMediaPlayer
Forum Updated to NodeBB v4.3 + New Features

How to play sounds using QMediaPlayer

Scheduled Pinned Locked Moved Solved Game Development
16 Posts 4 Posters 3.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • 8Observer88 Offline
    8Observer88 Offline
    8Observer8
    wrote on last edited by
    #1

    Hello. Why can't I play sound using the following code?

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QtWidgets/QWidget>
    #include <QtMultimedia/QMediaPlayer>
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        Widget(QWidget *parent = nullptr);
        ~Widget();
    
    private slots:
        void play();
    
    private:
        QMediaPlayer mediaPlayer;
    };
    #endif // WIDGET_H
    

    widget.cpp

    #include "widget.h"
    #include <QtCore/QUrl>
    #include <QtWidgets/QPushButton>
    
    Widget::Widget(QWidget *parent)
        : QWidget(parent)
    {
        mediaPlayer.setSource(QUrl("qrc:/assets/audio/music.wav"));
    
        QPushButton *playButton = new QPushButton("Play", this);
        connect(playButton, &QPushButton::pressed, this, &Widget::play);
    }
    
    Widget::~Widget()
    {
    }
    
    void Widget::play()
    {
        mediaPlayer.play();
        qDebug() << "play";
    }
    
    1 Reply Last reply
    0
    • 8Observer88 8Observer8

      My example from the topic works with Qt5 but doesn't work with Qt6.

      C Offline
      C Offline
      CPPUIX
      wrote on last edited by CPPUIX
      #7

      @8Observer8

      From Changes to Qt Multimedia in Qt 6:

      Audio inputs and output QMediaPlayer and QMediaCaptureSession (and the corresponding QML types MediaPlayer and CaptureSession) are not connected to any audio devices by default. Explicitly connect them to a QAudioInput/AudioInput or QAudioOutput/AudioOutput to capture or play back audio.

      You're not doing that in your code and I forgot to mention that I did so in my test; something like:

      mediaPlayer.setAudioOutput(new QAudioOutput);
      

      If this still does not fix it, try an absolute path just to verify it's a file access issue or not.

      8Observer88 1 Reply Last reply
      1
      • C Offline
        C Offline
        CPPUIX
        wrote on last edited by
        #2

        Hi,

        Try what's suggested here on Audio not playing from .qrc resources:

        • try "qrc://music/sound.mp3" and "qrc:/music/sound.mp3"

        qrc:// worked for me using your code.

        8Observer88 1 Reply Last reply
        1
        • C CPPUIX

          Hi,

          Try what's suggested here on Audio not playing from .qrc resources:

          • try "qrc://music/sound.mp3" and "qrc:/music/sound.mp3"

          qrc:// worked for me using your code.

          8Observer88 Offline
          8Observer88 Offline
          8Observer8
          wrote on last edited by
          #3

          Unfortunately it didn't help.

          mediaPlayer.setSource(QUrl("qrc://assets/audio/music.wav"));
          
          JonBJ 1 Reply Last reply
          0
          • 8Observer88 8Observer8

            Unfortunately it didn't help.

            mediaPlayer.setSource(QUrl("qrc://assets/audio/music.wav"));
            
            JonBJ Offline
            JonBJ Offline
            JonB
            wrote on last edited by
            #4

            @8Observer8
            There are several other suggestions in @Abderrahmene_Rayene's linked thread, at least for troubleshooting. Including

            Listen for the mediaStatusChanged() and error() signals to be notified when the media is loaded and when an error occurs during loading.

            1 Reply Last reply
            1
            • 8Observer88 Offline
              8Observer88 Offline
              8Observer8
              wrote on last edited by
              #5

              I added this:

                  connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this] (QMediaPlayer::MediaStatus status) -> void  {
                      qDebug() << "QMediaPlayer::mediaStatusChanged" << status;
                  });
              

              But I see this message only:

              widget.cpp:13: warning: Lambda capture 'this' is not used (fix available)

              1 Reply Last reply
              0
              • 8Observer88 Offline
                8Observer88 Offline
                8Observer8
                wrote on last edited by
                #6

                My example from the topic works with Qt5 but doesn't work with Qt6.

                C 1 Reply Last reply
                0
                • 8Observer88 8Observer8

                  My example from the topic works with Qt5 but doesn't work with Qt6.

                  C Offline
                  C Offline
                  CPPUIX
                  wrote on last edited by CPPUIX
                  #7

                  @8Observer8

                  From Changes to Qt Multimedia in Qt 6:

                  Audio inputs and output QMediaPlayer and QMediaCaptureSession (and the corresponding QML types MediaPlayer and CaptureSession) are not connected to any audio devices by default. Explicitly connect them to a QAudioInput/AudioInput or QAudioOutput/AudioOutput to capture or play back audio.

                  You're not doing that in your code and I forgot to mention that I did so in my test; something like:

                  mediaPlayer.setAudioOutput(new QAudioOutput);
                  

                  If this still does not fix it, try an absolute path just to verify it's a file access issue or not.

                  8Observer88 1 Reply Last reply
                  1
                  • C CPPUIX

                    @8Observer8

                    From Changes to Qt Multimedia in Qt 6:

                    Audio inputs and output QMediaPlayer and QMediaCaptureSession (and the corresponding QML types MediaPlayer and CaptureSession) are not connected to any audio devices by default. Explicitly connect them to a QAudioInput/AudioInput or QAudioOutput/AudioOutput to capture or play back audio.

                    You're not doing that in your code and I forgot to mention that I did so in my test; something like:

                    mediaPlayer.setAudioOutput(new QAudioOutput);
                    

                    If this still does not fix it, try an absolute path just to verify it's a file access issue or not.

                    8Observer88 Offline
                    8Observer88 Offline
                    8Observer8
                    wrote on last edited by 8Observer8
                    #8

                    @Abderrahmene_Rayene said in How to play sounds using QMediaPlayer:

                    new QAudioOutput

                    Yes, it helped! Thank you very much! Interesting that this didn't work with qrc:// and works with qrc:/

                    #include "widget.h"
                    #include <QtCore/QUrl>
                    #include <QtWidgets/QPushButton>
                    #include <QtMultimedia/QAudioOutput>
                    
                    Widget::Widget(QWidget *parent)
                        : QWidget(parent)
                    {
                        mediaPlayer.setSource(QUrl("qrc:/assets/audio/music.wav"));
                        mediaPlayer.setAudioOutput(new QAudioOutput);
                    
                        QPushButton *playButton = new QPushButton("Play", this);
                        connect(playButton, &QPushButton::pressed, this, &Widget::play);
                    
                        connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this] (QMediaPlayer::MediaStatus status) -> void  {
                            qDebug() << "QMediaPlayer::mediaStatusChanged" << status;
                        });
                    }
                    
                    Widget::~Widget()
                    {
                    }
                    
                    void Widget::play()
                    {
                        mediaPlayer.play();
                        qDebug() << "play";
                    }
                    
                    
                    JoeCFDJ 1 Reply Last reply
                    0
                    • 8Observer88 8Observer8 has marked this topic as solved on
                    • 8Observer88 8Observer8

                      @Abderrahmene_Rayene said in How to play sounds using QMediaPlayer:

                      new QAudioOutput

                      Yes, it helped! Thank you very much! Interesting that this didn't work with qrc:// and works with qrc:/

                      #include "widget.h"
                      #include <QtCore/QUrl>
                      #include <QtWidgets/QPushButton>
                      #include <QtMultimedia/QAudioOutput>
                      
                      Widget::Widget(QWidget *parent)
                          : QWidget(parent)
                      {
                          mediaPlayer.setSource(QUrl("qrc:/assets/audio/music.wav"));
                          mediaPlayer.setAudioOutput(new QAudioOutput);
                      
                          QPushButton *playButton = new QPushButton("Play", this);
                          connect(playButton, &QPushButton::pressed, this, &Widget::play);
                      
                          connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this] (QMediaPlayer::MediaStatus status) -> void  {
                              qDebug() << "QMediaPlayer::mediaStatusChanged" << status;
                          });
                      }
                      
                      Widget::~Widget()
                      {
                      }
                      
                      void Widget::play()
                      {
                          mediaPlayer.play();
                          qDebug() << "play";
                      }
                      
                      
                      JoeCFDJ Offline
                      JoeCFDJ Offline
                      JoeCFD
                      wrote on last edited by JoeCFD
                      #9

                      @8Observer8 said in How to play sounds using QMediaPlayer:

                      connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this] (QMediaPlayer::MediaStatus status) -> void  {
                          qDebug() << "QMediaPlayer::mediaStatusChanged" << status;
                      });
                      

                      Does the following work?

                      connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, 
                              [=](QMediaPlayer::MediaStatus status) -> void{ qDebug() << "QMediaPlayer::mediaStatusChanged" << status;}
                             );
                      
                      8Observer88 1 Reply Last reply
                      1
                      • JoeCFDJ JoeCFD

                        @8Observer8 said in How to play sounds using QMediaPlayer:

                        connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, this, [this] (QMediaPlayer::MediaStatus status) -> void  {
                            qDebug() << "QMediaPlayer::mediaStatusChanged" << status;
                        });
                        

                        Does the following work?

                        connect(&mediaPlayer, &QMediaPlayer::mediaStatusChanged, 
                                [=](QMediaPlayer::MediaStatus status) -> void{ qDebug() << "QMediaPlayer::mediaStatusChanged" << status;}
                               );
                        
                        8Observer88 Offline
                        8Observer88 Offline
                        8Observer8
                        wrote on last edited by
                        #10

                        @JoeCFD Yes! Thanks a lot!

                        1 Reply Last reply
                        0
                        • 8Observer88 8Observer8 referenced this topic on
                        • 8Observer88 Offline
                          8Observer88 Offline
                          8Observer8
                          wrote on last edited by 8Observer8
                          #11

                          Hello guys again. I want to rewrite the example above to PySide6 and PyQt6:

                          from PySide6.QtCore import QUrl
                          from PySide6.QtMultimedia import QAudioOutput, QMediaPlayer
                          from PySide6.QtWidgets import QPushButton, QWidget
                          
                          
                          class Widget(QWidget):
                              def __init__(self):
                                  super().__init__()
                          
                                  self.mediaPlayer = QMediaPlayer()
                                  self.mediaPlayer.setSource(QUrl("assets/audio/music.wav"))
                                  self.mediaPlayer.setAudioOutput(QAudioOutput())
                                  self.mediaPlayer.mediaStatusChanged.connect(lambda status : print(status))
                          
                                  playButton = QPushButton("Play", self)
                                  playButton.clicked.connect(self.play)
                          
                              def play(self):
                                  self.mediaPlayer.play()
                                  print("play")
                          

                          main.py

                          import sys
                          
                          from PySide6.QtCore import Qt
                          from PySide6.QtWidgets import QApplication
                          
                          from widget import Widget
                          
                          if __name__ == "__main__":
                              app = QApplication(sys.argv)
                              w = Widget()
                              w.show()
                              sys.exit(app.exec())
                          

                          But I have these errors:

                          MediaStatus.InvalidMedia
                          MediaStatus.LoadingMedia
                          play
                          MediaStatus.InvalidMedia

                          The path to the audio file is correct:

                          9b33ec0f-7d20-4871-8f12-42d3a0b02366-image.png

                          JonBJ 1 Reply Last reply
                          0
                          • 8Observer88 Offline
                            8Observer88 Offline
                            8Observer8
                            wrote on last edited by
                            #12

                            I tried to use fromLocalFile but I have the same result:

                            self.mediaPlayer.setSource(QUrl.fromLocalFile("assets/audio/music.wav"))
                            
                            1 Reply Last reply
                            0
                            • 8Observer88 8Observer8

                              Hello guys again. I want to rewrite the example above to PySide6 and PyQt6:

                              from PySide6.QtCore import QUrl
                              from PySide6.QtMultimedia import QAudioOutput, QMediaPlayer
                              from PySide6.QtWidgets import QPushButton, QWidget
                              
                              
                              class Widget(QWidget):
                                  def __init__(self):
                                      super().__init__()
                              
                                      self.mediaPlayer = QMediaPlayer()
                                      self.mediaPlayer.setSource(QUrl("assets/audio/music.wav"))
                                      self.mediaPlayer.setAudioOutput(QAudioOutput())
                                      self.mediaPlayer.mediaStatusChanged.connect(lambda status : print(status))
                              
                                      playButton = QPushButton("Play", self)
                                      playButton.clicked.connect(self.play)
                              
                                  def play(self):
                                      self.mediaPlayer.play()
                                      print("play")
                              

                              main.py

                              import sys
                              
                              from PySide6.QtCore import Qt
                              from PySide6.QtWidgets import QApplication
                              
                              from widget import Widget
                              
                              if __name__ == "__main__":
                                  app = QApplication(sys.argv)
                                  w = Widget()
                                  w.show()
                                  sys.exit(app.exec())
                              

                              But I have these errors:

                              MediaStatus.InvalidMedia
                              MediaStatus.LoadingMedia
                              play
                              MediaStatus.InvalidMedia

                              The path to the audio file is correct:

                              9b33ec0f-7d20-4871-8f12-42d3a0b02366-image.png

                              JonBJ Offline
                              JonBJ Offline
                              JonB
                              wrote on last edited by
                              #13

                              @8Observer8

                              QUrl("assets/audio/music.wav")

                              Test with an absolute path rather than a relative one. Not sure what the current directory is when running Python script, so check this is not the issue?

                              8Observer88 1 Reply Last reply
                              0
                              • JonBJ JonB

                                @8Observer8

                                QUrl("assets/audio/music.wav")

                                Test with an absolute path rather than a relative one. Not sure what the current directory is when running Python script, so check this is not the issue?

                                8Observer88 Offline
                                8Observer88 Offline
                                8Observer8
                                wrote on last edited by
                                #14

                                @JonB I tried, but no, it doesn't work. The result is the same as above

                                1 Reply Last reply
                                0
                                • 8Observer88 Offline
                                  8Observer88 Offline
                                  8Observer8
                                  wrote on last edited by 8Observer8
                                  #15

                                  But if I write the wrong path, I get a different error message:

                                  self.mediaPlayer.setSource(QUrl("wrong_path/audio/music.wav"))
                                  
                                  handleSourceError: 0x80070003
                                  MediaStatus.InvalidMedia
                                  MediaStatus.LoadingMedia
                                  play
                                  handleSourceError: 0x80070003
                                  MediaStatus.InvalidMedia
                                  
                                  1 Reply Last reply
                                  0
                                  • 8Observer88 Offline
                                    8Observer88 Offline
                                    8Observer8
                                    wrote on last edited by
                                    #16

                                    I solved the problem! I found the solution here: https://zhuanlan.zhihu.com/p/521028351

                                            self.audioOutput = QAudioOutput()
                                            self.mediaPlayer.setAudioOutput(self.audioOutput)
                                    
                                    1 Reply Last reply
                                    0

                                    • Login

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • Users
                                    • Groups
                                    • Search
                                    • Get Qt Extensions
                                    • Unsolved