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