[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