[Gelöst] Qt MediaPlayer mp3 abspielen



  • Hallo,
    ich würde gerne eine mp3 mit Qt und der Klasse QMediaPlayer abspielen.
    aber mein Quellcode funktioniert nicht.

    #ifndef QTSOUNDSABSPIELEN_H
    #define QTSOUNDSABSPIELEN_H
    
    #include <qpushbutton.h>
    #include <qboxlayout.h>
    #include <QDialog>
    #include <qmediaplayer.h>
    #include <qurl.h>
    
    class qtsoundsabspielen : public QDialog
    {
    	Q_OBJECT
    
    public:
    	qtsoundsabspielen(QWidget *parent = 0): start(new QPushButton) {
    		start->setText("Start");
    
    		QBoxLayout  * zeil1 = new QBoxLayout(QBoxLayout::LeftToRight);
    		QBoxLayout * alles = new QBoxLayout(QBoxLayout::BottomToTop);
    		zeil1->addWidget(start);
    
    		alles->addLayout(zeil1);
    
    		setLayout(alles);
    
    		connect(start, SIGNAL(clicked()), this, SLOT(play_start()));
    
    	}
    
    private slots:
    void play_start() {
    	temp = new QMediaPlayer(this);
    
    	temp->setMedia(QUrl("qrl:dialog/1.mp3"));
    	temp->play();
    	temp->setVolume(70);
    	qDebug() << temp->errorString();
    
    }
    
    private:
    
    	QPushButton *start;
    	QMediaPlayer * temp;
    };
    
    #endif // QTSOUNDSABSPIELEN_H
    

    Die Sounddatei befindet sich in einen Ordner, welcher sich dort wo der Quellcode ist befindet. Die Exe befindet sich aber in einen Ordner welcher neben den order liegt, wo der Quelltext und der Dialog-Ordner sind. Ich hab aber auch schon versucht den Dialog-Ordner neben die Exe datei zu platzierne. Hat nichts geholfen



  • Du Versucht die datei als Qt ressource anzusprechen.
    Hast du überhaupt die Datei zu einem ressourcen file (*.qrc) hinzugefügt und im build system mit angegeben?
    Und ich bin mir nicht sicher ob die verwendete syntax richtig ist.
    Mach dich mal schlau wie man in Qt ressourcen behandelt.



  • firefly schrieb:

    Du Versucht die datei als Qt ressource anzusprechen.
    Hast du überhaupt die Datei zu einem ressourcen file (*.qrc) hinzugefügt und im build system mit angegeben?
    Und ich bin mir nicht sicher ob die verwendete syntax richtig ist.
    Mach dich mal schlau wie man in Qt ressourcen behandelt.

    ok hab ich jetzt gemacht
    ich hab die Sounddatei nun in einer .qrc mit den Namen sound_test.qrc . Dort hab ich dann ein Prafix hinzugefügt mit den namen "/test". In "/test" hab ich nun die mp3 datei hinzugefügt. Nun hab ich mit Rechtsclick die URL Adresse kopiert und eingefügt.

    temp = new QMediaPlayer;
    
            temp->setMedia(QUrl("qrc:/test/1.mp3"));
            temp->play();
    

    es funktioniert immer noch nicht 😕



  • p.s es werden mir unten in "Ausgabe der Anwendung" ein "" angezeigt. Wenn die Mp3 abspielen soll.

    das Laden eines Bildes funktioniert aber

    QPalette pal;
             pal.setBrush( this->backgroundRole(), QBrush( QImage( ":/bilder/image.png" ) ) );
             this->setPalette(pal);
    


  • ok mit einer .wav datei funktioniert es, warum aber nicht mit einer mp3 😕



  • Auf welchem Betriebssystem testest du?



  • 5cript schrieb:

    Auf welchem Betriebssystem testest du?

    Windows 10



  • EDIT: http://stackoverflow.com/questions/24377720/play-mp3-file-in-the-resource-with-qmediaplayer

    Zwar konfliktiert die zweite Antwort mit der ersten, aber ich weiß ja nicht welche Qt version du verwendest, außerdem ist in einem Kommentar der zweiten Antwort jemand, der genauso wie du, das Problem immernoch hat.

    Alte Antwort:
    *Weil ich mit dem QMediaPlayer schonmal Probleme hatte, das war aber glaube ich auf einem Embedded Gerät.
    Die benutzen AFAIR gstreamer zur Wiedergabe (wie clementine, weil Qt Projekt)

    Ich kann es jetzt leider nicht ausprobieren.
    *



  • Im Thread steht da:

    You should play a file from disk; not a Qt resource. Since the resources are not supported yet. You can copy the file from resource to your hard drive on the fly and then play it :

    QFile::copy(":/files/FarAway.mp3" , "/some/path/FarAway.mp3");
    

    Ich soll es also nicht als Ressource laden sondern von der Festplatte?
    Wie gebe ich dann den relativen Phat an?
    Beispiel: Im Projektordner ist ein Ordner mit den Namen "dialoge" und dort ist dann "1.mp3" drin.

    p.s: bei

    temp->setMedia(QFile::copy(":/dialog/1.mp3"));
    

    setht da jetzt

    C:\Users\...\qtsoundabspielen.h:17: Fehler: C2352: "QFile::copy": Unzulässiger Aufruf einer nicht statischen Memberfunktion
    

    p.s.s Ich verwende Qt 5.6



  • Du könntest zum Beispiel beim start des programmes ein temp ordner anlegen im verzeichnis, oder den system temp ordner verwenden und das da hinspeichern.

    Bei Programmstart:

    QDir soundsDir = QDir("./sounds");
    if (!soundsDir.exists()) // create sound directory if not existant.
        soundsDir.mkdir(".");
    
    // copy from resources to hard drive
    QFile::copy(":/sounds/bla.mp3", "./sounds/bla.mp3");
    

    EDIT: "." ist hier der Ordner in dem das Programm ausgeführt wird. (Wenn du es von der IDE aus startest, muss das nicht der gleiche Ordner sein, wie der, in dem sich dein Programm befindet.)

    Bei laden der Datei:

    mediaPlayer->setMedia(QUrl("./sounds/bla.mp3")); // play from harddrive
    

    EDIT:

    C:\Users\...\qtsoundabspielen.h:17: Fehler: C2352: "QFile::copy": Unzulässiger Aufruf einer nicht statischen Memberfunktion

    schau mal in die doku: http://doc.qt.io/qt-5/qfile.html#copy. QFile::copy ist überladen.
    Einmal mit einem Argument, für den Fall, dass QFile mit dem Konstruktor erzeugt wurde und eine Datei "verwaltet", die dann durch die Angabe eines Ziels kopiert wird. Oder mit 2 Argumenten als statische Funktion, die Quelldateipfad und Zieldateipfad nimmt und so kopiert.



  • 5cript schrieb:

    Du könntest zum Beispiel beim start des programmes ein temp ordner anlegen im verzeichnis, oder den system temp ordner verwenden und das da hinspeichern.

    Bei Programmstart:

    QDir soundsDir = QDir("./sounds");
    if (!soundsDir.exists()) // create sound directory if not existant.
        soundsDir.mkdir(".");
    
    // copy from resources to hard drive
    QFile::copy(":/sounds/bla.mp3", "./sounds/bla.mp3");
    

    EDIT: "." ist hier der Ordner in dem das Programm ausgeführt wird. (Wenn du es von der IDE aus startest, muss das nicht der gleiche Ordner sein, wie der, in dem sich dein Programm befindet.)

    Bei laden der Datei:

    mediaPlayer->setMedia(QUrl("./sounds/bla.mp3")); // play from harddrive
    

    EDIT:

    C:\Users\...\qtsoundabspielen.h:17: Fehler: C2352: "QFile::copy": Unzulässiger Aufruf einer nicht statischen Memberfunktion

    schau mal in die doku: http://doc.qt.io/qt-5/qfile.html#copy. QFile::copy ist überladen.
    Einmal mit einem Argument, für den Fall, dass QFile mit dem Konstruktor erzeugt wurde und eine Datei "verwaltet", die dann durch die Angabe eines Ziels kopiert wird. Oder mit 2 Argumenten als statische Funktion, die Quelldateipfad und Zieldateipfad nimmt und so kopiert.

    danke für die antwort

    hab es jetzt mit:

    soundsDir = new QDir("./dialog");
            if (!soundsDir->exists()){ // create sound directory if not existant.
                soundsDir->mkdir(".");
                qErrnoWarning("nicht existent");
            }
    
            // copy from resources to hard drive
            QFile::copy(":/test/1.mp3", "./dialog/1.mp3");
     //:/test/1.mp3 ist der Resurzendateipfad, ./dialog/1.mp3 ist der echt ordner mit der mp3
    
            slider->setGeometry(QRect(300,300,200,50));
            temp->setMedia(QUrl("./dialog/1.mp3"));
            temp->play();
    
    //Ausgabe der Anwendung:
    //DirectShowPlayerService::doRender: Unresolved error code 80040266
    

    funktioniert immer noch nicht.



  • Probiers mal mit einem absoluten pfad zur Datei um auszuschließen das er die datei nur nicht finden kann.
    Eventuell liefert der media player entsprechende Fehlermeldungen (z.b. als signal oder als methode um den letzten fehler zu bekommen)



  • firefly schrieb:

    Probiers mal mit einem absoluten pfad zur Datei um auszuschließen das er die datei nur nicht finden kann.
    Eventuell liefert der media player entsprechende Fehlermeldungen (z.b. als signal oder als methode um den letzten fehler zu bekommen)

    danke für die antwort.

    hab es mit

    QFile::copy("C:\\Users\\...\\dialog\\1.mp3", "./dialog/1.mp3");
    
            slider->setGeometry(QRect(300,300,200,50));
            temp->setMedia(QUrl("./dialog/1.mp3"));
    

    und noch einmal wo umgekeht (der absolute Pfad beim Qfile als zweites und bei QUrl).
    Beides mal nichts 😞



  • http://stackoverflow.com/questions/18134724/qmediaplayer-resource-error

    googelt man nun nach "VFW_E_NO_TRANSPORT mp3" ergibt das die gleichen Antworten.
    Probiere andere Mp3 dateien und sollte es dann gehn, musst du den Tag deiner eigentlichen Datei bearbeiten.

    Ich selbst bin jedoch kein Freund der QMediaPlayer Komponente. Eigentlich wegen gstreamer auf linux, aber dass DirectShow Probleme mit modernen id3 tags hat, finde ich jetzt auch eher Übelkeitserregend.

    Aber ich glaube jetzt ist das Problem in lösbarer Nähe...

    EDIT: Übrigens: dein zunächst unscheinbarer Kommentar hat mich auf die Lösung gebracht, den hab ich zuerst überlesen:

    "//Ausgabe der Anwendung:
    //DirectShowPlayerService::doRender: Unresolved error code 80040266"

    80040266 springt einem sofort als dshow Fehlercode ins auge (also wenns jetzt nicht schon davor stünde)
    "QMediaPlayer 80040266" in google ergibt den link ganz oben.



  • 5cript schrieb:

    http://stackoverflow.com/questions/18134724/qmediaplayer-resource-error

    googelt man nun nach "VFW_E_NO_TRANSPORT mp3" ergibt das die gleichen Antworten.
    Probiere andere Mp3 dateien und sollte es dann gehn, musst du den Tag deiner eigentlichen Datei bearbeiten.

    Ich selbst bin jedoch kein Freund der QMediaPlayer Komponente. Eigentlich wegen gstreamer auf linux, aber dass DirectShow Probleme mit modernen id3 tags hat, finde ich jetzt auch eher Übelkeitserregend.

    Aber ich glaube jetzt ist das Problem in lösbarer Nähe...

    EDIT: Übrigens: dein zunächst unscheinbarer Kommentar hat mich auf die Lösung gebracht, den hab ich zuerst überlesen:

    "//Ausgabe der Anwendung:
    //DirectShowPlayerService::doRender: Unresolved error code 80040266"

    80040266 springt einem sofort als dshow Fehlercode ins auge (also wenns jetzt nicht schon davor stünde)
    "QMediaPlayer 80040266" in google ergibt den link ganz oben.

    Hab Tausend Dank es funktiert nun endlich. 🙂 🙂

    Danke an euch für eure Hilfe 👍


Anmelden zum Antworten