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.
  • 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