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 Update on Monday, May 27th 2025

How to play sounds using QMediaPlayer

Scheduled Pinned Locked Moved Solved Game Development
16 Posts 4 Posters 3.3k Views
  • 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