Pregunta

Quiero añadir soporte para la reproducción de archivos mp3 en mi Qt aplicación para Linux embebido.

No soy capaz de utilizar los fonones en Qt. Después de la adición de QT + = fonones en .pro archivo que me da el siguiente error durante la compilación: /usr/lib/gcc/i486-linux-gnu/4.4.1/../../../../lib/libphonon.so: referencia indefinida a `QWidget :: x11Event (_XEvent *) '

/usr/lib/gcc/i486-linux-gnu/4.4.1 /../../../../ lib / libphonon.so: undefined reference to `QDataStream :: QDataStream (QByteArray *, int) '

collect2: ld devolvió el código de salida 1

Así que ahora estoy pensando en usar la lib mpg123 para decodificar los archivos mp3.

Necesito ayuda para la integración de la biblioteca en Qt. Nunca he utilizado una biblioteca de C ++ puro en Qt antes, así que no tengo mucha idea sobre cómo integrarlo.

¿Fue útil?

Solución

Hola a todos !! Finalmente lo he descubierto !!

int MP3Player::Init(const char *pFileName)

{

    mpg123_init();

    m_mpgHandle = mpg123_new(0, 0);
    if(mpg123_open(m_mpgHandle, pFileName) != MPG123_OK)
    {
        qFatal("Cannot open %s: %s", pFileName, mpg123_strerror(m_mpgHandle));
        return 0;
    }
}

int MP3Player::Play()

{

    unsigned char *audio;
    int mc;
    size_t bytes;
    qWarning("play_frame");


    static unsigned char* arr = 0;

    /* The first call will not decode anything but return MPG123_NEW_FORMAT! */

    mc = mpg123_decode_frame(m_mpgHandle, &m_framenum, &audio, &bytes);

    if(bytes)
    {

        /* Normal flushing of data, includes buffer decoding. */

        /*This function is my already implemented audio class which uses ALSA to output decoded audio to Sound Card*/
        if (m_audioPlayer.Play(arr,bytes) < (int)bytes) 
        {
            qFatal("Deep trouble! Cannot flush to my output anymore!");
        }

    }
    /* Special actions and errors. */
    if(mc != MPG123_OK)
    {
        if(mc == MPG123_ERR)
        {
            qFatal("...in decoding next frame: %s", mpg123_strerror(m_mpgHandle));
            return CSoundDecoder::EOFStream;

        }
        if(mc == MPG123_DONE)
        {
            return CSoundDecoder::EOFStream;
        }
        if(mc == MPG123_NO_SPACE)
        {
            qFatal("I have not enough output space? I didn't plan for this.");
            return CSoundDecoder::EOFStream;
        }
        if(mc == MPG123_NEW_FORMAT)
        {
            long iFrameRate;
            int encoding;
            mpg123_getformat(m_mpgHandle, &iFrameRate, &m_iChannels, &encoding);

            m_iBytesPerChannel = mpg123_encsize(encoding);

            if (m_iBytesPerChannel == 0)
                qFatal("bytes per channel is 0 !!");

            m_audioPlayer.Init(m_iChannels , iFrameRate , m_iBytesPerChannel);

        }
    }
}

Otros consejos

Con el fin de conseguir mpg123 de trabajo con su proyecto de QT intenta siguientes pasos:

1.download e instalar mpg123: desde la carpeta en la que extrajo a (por ejemplo /home/mpg123-1.13.0/) ./configure carrera y luego "sudo make install"

2. Si no hay errores de poner esta línea a su archivo * .pro

LIBS += /usr/local/lib/libmpg123.so

3.then código de abajo debería funcionar bien para usted:

#include "mpg123.h"
#include <QDebug>

void MainWindow::on_pushButton_2_clicked()
{
    const char **decoders = mpg123_decoders();
    while (*decoders != NULL)
    {
        qDebug() << *decoders;
        decoders++;
    }
}

Como alternativa, puede llamar mpg123 a través de llamadas al sistema:

system("mpg123 /home/test.mp3"); 

Espero que esta ayuda, respecto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top