Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Game Development
  4. How to play sounds using QMediaPlayer
Qt 6.12 LTS is out! See what's new in the release blog

How to play sounds using QMediaPlayer

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