Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. QMediaPlayer “Failed to load media” on iOS
Forum Updated to NodeBB v4.3 + New Features

QMediaPlayer “Failed to load media” on iOS

Scheduled Pinned Locked Moved Mobile and Embedded
19 Posts 4 Posters 5.3k Views 4 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.
  • canellasC Offline
    canellasC Offline
    canellas
    wrote on last edited by
    #1

    Hi!

    My application is written using QWidget, no QtQuick, and on iOS 'QMediaPlayer::supportedAudioCodecs()' returns '("audio/pcm")' and 'QMediaPlayer::supportedContainers()' returns ' ("audio/x-wav", "audio/x-raw")'.

    An audio file was recorded at 'QUrl("file:///Users/canellas/Library/Application Support/iPhone Simulator/2.2/Documents/Desktop/28_94_1.wav")', but when I try to play it, QMediaPlayer signals 'error', and the slot I wrote prints the error parameter as 'QMediaPlayer::FormatError', and 'QMediaPlayer::errorString()' prints "Failed to load media".

    The same code works fine on Android and OSX.

    Could the space in 'Application Support' or in 'iPhone Simulator' cause this error? I wonder because the path on OSX or on Android has no spaces. I tried to create a QUrl object using HTML codes for spaces, but, AKAIK, QUrl does not allow it.

    Thanks!

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      Might be more related to the fact that you are using a simulator. Can you check that again on a real device ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      canellasC 1 Reply Last reply
      0
      • SGaistS SGaist

        Hi,

        Might be more related to the fact that you are using a simulator. Can you check that again on a real device ?

        canellasC Offline
        canellasC Offline
        canellas
        wrote on last edited by
        #3

        @SGaist

        Unfortunately, not right now... only next Monday... I'll try again, and let you know.

        Thanks!

        1 Reply Last reply
        0
        • canellasC Offline
          canellasC Offline
          canellas
          wrote on last edited by canellas
          #4

          Well, I tried again using a real iPhone, but it did not work.

          I would appreciate very much any other idea...

          Thanks!

          1 Reply Last reply
          0
          • canellasC Offline
            canellasC Offline
            canellas
            wrote on last edited by
            #5

            More and more it seems to have something to do with the path. Running on the iOS simulator, I was able to change the path to "file:///Users/canellas/", and the audio file was recorded and played back normally.

            I'll try to change the path in the iPhone, and compare the results.

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              Try creating your URL with QUrl::fromLocalFile

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              1 Reply Last reply
              0
              • canellasC Offline
                canellasC Offline
                canellas
                wrote on last edited by canellas
                #7

                SGaist,

                I really appreciate your help. Thanks a lot!

                I wrote a slot for 'error' signal from QAudioRecorder, which is actually inherited from QMediaRecorder, and it revealed the 'QMediaRecorder::ResourceError'.

                That happens in the simulator as well as on the iPhone.

                I am searching the web, but no luck so far.

                Any ideas?

                Thanks!

                1 Reply Last reply
                0
                • SGaistS Offline
                  SGaistS Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on last edited by
                  #8

                  Did you change the QUrl creation part like suggested ?

                  Interested in AI ? www.idiap.ch
                  Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                  1 Reply Last reply
                  0
                  • canellasC Offline
                    canellasC Offline
                    canellas
                    wrote on last edited by
                    #9

                    Sorry, I forgot to report that I've changed the QUrl construction, as you suggested, but with no different results

                    1 Reply Last reply
                    0
                    • SGaistS Offline
                      SGaistS Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on last edited by
                      #10

                      Did you check that it's valid just in case ?

                      Interested in AI ? www.idiap.ch
                      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                      1 Reply Last reply
                      0
                      • canellasC Offline
                        canellasC Offline
                        canellas
                        wrote on last edited by
                        #11

                        Yes, it was a valid path.

                        1 Reply Last reply
                        0
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          I meant: did you validate that with QUrl ? With isValid and isLocalFile ?

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • canellasC Offline
                            canellasC Offline
                            canellas
                            wrote on last edited by
                            #13

                            I believe it is.

                            The following code

                            void Gravar::h6() {
                            
                                qDebug() << "h6 >>>";
                            
                                try {
                                    set_current(playing);
                            
                                    qDebug() << "m_audio_recorder->outputLocation() = " << m_audio_recorder->outputLocation();
                            
                                    QString _path = m_audio_recorder->outputLocation().path();
                                    qDebug() << "_path = " << _path;
                            
                                    QUrl _url (QUrl::fromLocalFile(_path));
                                    qDebug() << "url = " << _url;
                            
                                    if  (!_url.isValid()) {
                                        qDebug() << "INVALID URL!";
                                        return;
                                    }
                            
                                    qDebug() << "valid url";
                            
                                    if (!_url.isLocalFile()) {
                                        qDebug() << "NOT A LOCAL FILE!";
                                        return;
                                    }
                            
                                    qDebug() << "local file";
                            
                                    QMediaContent _content(_url);
                                    qDebug() << "h6-content '" << _content.canonicalUrl() << "'\n";
                            
                                    m_player->setMedia(_content);
                                    m_player->setVolume(100);
                                    m_player->play();
                                }
                                catch (std::exception & _ex) {
                                    qDebug() << "FATAL: '" << _ex.what() << "'\n";
                                    state_transition(reset);
                                }
                            
                                qDebug() << "h6 <<<";
                            }
                            

                            prints this output:

                            h6 >>>
                            m_audio_recorder->outputLocation() =  QUrl("file:///var/mobile/Containers/Data/Application/CBAAF069-4B9B-4521-9BB2-0754DBA3E24F/Documents/Music/28_94_1.wav")
                            _path =  "/var/mobile/Containers/Data/Application/CBAAF069-4B9B-4521-9BB2-0754DBA3E24F/Documents/Music/28_94_1.wav"
                            url =  QUrl("file:///var/mobile/Containers/Data/Application/CBAAF069-4B9B-4521-9BB2-0754DBA3E24F/Documents/Music/28_94_1.wav")
                            valid url
                            local file
                            h6-content ' QUrl("file:///var/mobile/Containers/Data/Application/CBAAF069-4B9B-4521-9BB2-0754DBA3E24F/Documents/Music/28_94_1.wav") '
                            
                            h6 <<<
                            

                            I think it is very important to notice that when I call 'm_audio_recorder->record()', a slot I wrote for 'error' signal from QAudioRecorder prints 'Recording error: QMediaRecorder::ResourceError', and from there on, no signal is emitted anymore.

                            Again, thanks a lot for your help.

                            1 Reply Last reply
                            0
                            • NickVN Offline
                              NickVN Offline
                              NickV
                              wrote on last edited by
                              #14

                              You can try this in the .pro file:

                              QTPLUGIN += qtaudio_coreaudio

                              1 Reply Last reply
                              0
                              • canellasC Offline
                                canellasC Offline
                                canellas
                                wrote on last edited by
                                #15

                                I've already tried that, and I can do it again, but only tomorrow, because today I am trying to solve the problem of pausing the voice recording in Android.

                                I'll let you know the results.

                                Thanks!

                                1 Reply Last reply
                                0
                                • canellasC Offline
                                  canellasC Offline
                                  canellas
                                  wrote on last edited by
                                  #16

                                  I found what is causing the error!

                                  Running the app on a iPhone 5 real device, when I print the standard paths, I get:

                                  DesktopLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Documents/Desktop"
                                  DocumentsLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Documents"
                                  ApplicationsLocation = ""
                                  MusicLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Documents/Music"
                                  MoviesLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Documents/Movies"
                                  PicturesLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Documents/Pictures"
                                  TempLocation = "/private/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/tmp"
                                  HomeLocation = "/private/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738"
                                  DataLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Application Support/perinatal__app__app_mae"
                                  CacheLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Caches/perinatal__app__app_mae"
                                  GenericDataLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Application Support"
                                  RuntimeLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Application Support"
                                  ConfigLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Preferences"
                                  GenericConfigLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Preferences"
                                  DownloadLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Documents/Downloads"
                                  GenericCacheLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Caches"
                                  AppDataLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Application Support/perinatal__app__app_mae"
                                  AppLocalDataLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Application Support/perinatal__app__app_mae"
                                  AppConfigLocation = "/var/mobile/Containers/Data/Application/D424B7BE-6230-4868-8B85-09324C845738/Library/Preferences/perinatal__app__app_mae"

                                  The first problem is that the all the paths starting with '/var/' are wrong, the actual path is '/private/var'. So, when I try to use 'MusicLocation', in the slot for the 'error' signal, 'QAudioRecorder::errorString' prints "Can't open output location". I can not prefix 'MusicLocation' with '/private' because this location changes between versions of iPhone.

                                  Running the 'Examples/multimedia/audiorecorder' example, it is possible to navigate in the file system of the iPhone 5, and one can see that the '/var' directory is actually a link, but when you enter the directory, although one could expect to see the 'mobile' sub directory, there is nothing there.

                                  The documentation for 'QStandardPaths::writableLocation(StandardLocation type)' says "Note: The storage location returned can be a directory that does not exist; i.e., it may need to be created by the system or the user.", but I can not create any directory below '/var', where ever it really is.

                                  In the iPhone 6 simulator, the 'MusicLocation' is "/Users/canellas/Library/Application Support/iPhone Simulator/2.2/Documents/Music", wich does not exist, but I could create it. I do not know if I would be able to create it, if it was a real iPhone device.

                                  I could not create the audio file at 'HomeLocation'. The only path that worked was 'TempLocation', on the iPhone 5 cell, and on the iPhone 6 simulator.

                                  Does anyone know how correctly use 'QStandardPaths'? Or am I using it right, and there is a bug there?

                                  Thanks a lot for reading all this! 8)

                                  1 Reply Last reply
                                  0
                                  • SGaistS Offline
                                    SGaistS Offline
                                    SGaist
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #17

                                    Which version of iOS are you running ?

                                    Interested in AI ? www.idiap.ch
                                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                                    1 Reply Last reply
                                    0
                                    • canellasC Offline
                                      canellasC Offline
                                      canellas
                                      wrote on last edited by
                                      #18

                                      On the iPhone 5 it is 9.3.3 (13G34). On the iPhone 6s simulator it is 9.3 (13E30).

                                      Thanks!

                                      1 Reply Last reply
                                      0
                                      • G Offline
                                        G Offline
                                        GBergamo
                                        wrote on last edited by
                                        #19

                                        Any update on this?

                                        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