QAudioOutput

lecteur de musiques

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à toutes et à tous,

Je me suis lancé dans le projet de faire un lecteur de musique. Je le ferai par étapes :

  • d'abord pouvoir lire un fichier audio spécifique, le mettre en pause, reprendre la lecture, l'arrêter
  • ensuite pouvoir choisir le fichier que l'on veut
  • rajouter la possibilité de gérer une bibliothèque musicale
  • et peut-être d'autres choses encore en fonction de ce qui me vient à l'esprit.

Pour l'instant je n'en suis qu'à la première étape et je bloque sur l'utilisation de QAudioOutput. Voilà mon code à l'état actuel :

main.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <QApplication>
#include "window.h"

int main(int argc, char *argv[])

{
    QApplication app(argc, argv);
    Window mainWindow;
    mainWindow.show();
    return app.exec();
}

window.h

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#ifndef WINDOW_H
#define WINDOW_H

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QMessageBox>
#include <QMainWindow>
#include <QAudioOutput>
#include <QFile>
#include <QGridLayout>
#include <QDebug>

class Window : public QMainWindow
{
    public:
        Window();
        ~Window();

    public slots :
        void play();
        void pause();
        void stop();

    private :
        QWidget *m_centralWidget;
        QGridLayout *m_grid;
        QPushButton *m_buttonPlay;
        QPushButton *m_buttonPause;
        QPushButton *m_buttonStop;
        QFile m_audioFile;
        QAudioOutput *m_audio;

};

#endif // WINDOW_H

window.cpp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "window.h"

Window::Window() : QMainWindow(), m_audioFile("musique.mp3")
{
    m_grid = new QGridLayout;
    m_buttonPlay = new QPushButton("Play");
    m_grid->addWidget(m_buttonPlay,1,1);
    m_buttonPause = new QPushButton("Pause");
    m_grid->addWidget(m_buttonPause,2,1);
    m_buttonStop = new QPushButton("Stop");
    m_grid->addWidget(m_buttonStop,3,1);
    m_centralWidget = new QWidget;
    m_centralWidget->setLayout(m_grid);
    setCentralWidget(m_centralWidget);

    m_audio = new QAudioOutput;
    connect(m_buttonPlay, &QPushButton::clicked, this, &Window::play);

}

Window::~Window()
{
    delete m_audio;
}

void Window::play() {
    if(m_audio->state() == QAudio::StoppedState) {
        m_audioFile.open(QIODevice::ReadOnly);
        m_audio->start(&m_audioFile);
        connect(m_buttonPause, &QPushButton::clicked, this, &Window::pause);
        connect(m_buttonStop, &QPushButton::clicked, this, &Window::stop);
        disconnect(m_buttonPlay, &QPushButton::clicked, this, &Window::play);
    }
    else if (m_audio->state() == QAudio::SuspendedState) {
        m_audio->resume();
        connect(m_buttonPause, &QPushButton::clicked, this, &Window::pause);
        disconnect(m_buttonPlay, &QPushButton::clicked, this, &Window::play);
    }
    else {
        QMessageBox::critical(this, "erreur", "erreur");
    }
}

void Window::pause() {
    m_audio->suspend();
    connect(m_buttonPlay, &QPushButton::clicked, this, &Window::play);
    disconnect(m_buttonPause, &QPushButton::clicked, this, &Window::pause);
}

void Window::stop() {
    m_audio->stop();
    m_audioFile.close();
    connect(m_buttonPlay, &QPushButton::clicked, this, &Window::play);
    disconnect(m_buttonStop, &QPushButton::clicked, this, &Window::stop);
    disconnect(m_buttonPause, &QPushButton::clicked, this, &Window::pause);
}

Le programme compile, là n'est pas le soucis, le soucis est lors de l'exécution, lorsque j'essaie de jouer le morceau de musique, j'ai ceci :

QAudioOutput: open error, invalid format.

Je sais que cela est dû à un souci de codec, je suis allé voir la doc de Qt et j'ai fait comme il est indiqué sur la doc, c'est-à-dire que j'ai créé un QAudioFormat :

1
2
3
4
5
6
7
QAudioFormat format;
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(8);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);

et j'ai construit m_audio en passant en argument format. Cependant si le message d'erreur deQAudioOutput disparait avec ça, le morceau n'est lui toujours pas joué. J'ai donc cherché un codec pour les fichiers mp3, il y en beaucoup mais LAME m'a l'air pas mal. Ma question est comment puis-je compiler la source pour avoir le dll (il y a des projets MVSC tous prêts mais ils ne marchent pas et j'ai essayé de faire comme indiqué dans le fichier INSTALL mais je n'y arrive pas…) et comment je peux utiliser ce codec dans mon programme.

Merci d'avance

Édité par Typhlos

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte