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.8k 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 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