IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Utilisation du codec Speex


Sujet :

Qt

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut Utilisation du codec Speex
    Bonjour,

    J'essaie d'utiliser speex afin d'encoder puis de décoder un flux audio provenant de mon micro, puis de le jouer sur mes haut parleur.
    Je parviens sans problème à récupérer le flux puis à le lire sur les hauts parleurs.

    Voici le QAudioFormat que j'utilise pour mon flux audio
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    _audioFormat.setSampleRate(8000);
    _audioFormat.setChannelCount(1);
    _audioFormat.setSampleSize(16);
    _audioFormat.setCodec("audio/pcm");
    _audioFormat.setByteOrder(QAudioFormat::LittleEndian);
    _audioFormat.setSampleType(QAudioFormat::UnSignedInt);
    J'utilise la classe QAudioInput et QAudioOutput pour me "connecter" à mon micro et mes hauts parleurs.
    Ces classe retourne un QIODevice quand on appel start afin de pouvoir lire dans le cas du micro et écrire dans le cas du haut parleur.

    Voici mon code pour lire puis écrire directement dans le haut parleur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void        TEST::inputReadyRead(QIODevice *io)
    {
        QIODevice *output = LocalAudioManager::shared().outputIO();
        output->write(io->readAll());
    }
    TEST::inputReadyRead(QIODevice *io) est un slot qui est appelé à chaque fois que des données à lire son disponibles.

    Mon problème est lorsque j'utilise ce code au lieu de celui juste au dessus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void        TEST::inputReadyRead(QIODevice *io)
    {
        QIODevice *output = LocalAudioManager::shared().outputIO();
     
        SpeexCodecWrapper& speex = LocalAudioManager::shared().speexWrapper();
     
        QByteArray encodedData = speex.encodeBufferB(io);
        QByteArray decodedData = speex.decodeBufferB(encodedData);
        output->write(decodedData);
    }
    Voici les fonction encodeBufferB et decodeBufferB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    QByteArray      SpeexCodecWrapper::encodeBufferB(QIODevice *input)
    {
        int lFrameSize = 0;
        speex_decoder_ctl(_decState, SPEEX_GET_FRAME_SIZE, &lFrameSize);
     
        QByteArray data(input->readAll());
     
        QAudioFormat const& format = LocalAudioManager::shared().audioFormat();
        qint32 nFrames = format.framesForBytes(data.size());
     
        speex_bits_reset(&_encBits);
        speex_encode_int(_encState, (spx_int16_t*)data.data(), &_encBits);
     
        int nbBytes = speex_bits_nbytes(&_encBits);
     
        QByteArray lSpeexData(nbBytes * 10, 0);
        nbBytes = speex_bits_write(&_encBits, lSpeexData.data(), nbBytes * 10);
        lSpeexData.resize(nbBytes);
     
        return (lSpeexData);
    }
     
    QByteArray      SpeexCodecWrapper::decodeBufferB(QByteArray pData)
    {
        speex_bits_read_from(&_decBits, pData.data(), pData.size());
        int lFrameSize = 0;
        speex_decoder_ctl(_decState, SPEEX_GET_FRAME_SIZE, &lFrameSize);
        QByteArray lDecodedData(lFrameSize * 2, 0);
        /*int nbBytes = */speex_decode_int(_decState, &_decBits, (spx_int16_t*)lDecodedData.data());
     
        return (lDecodedData);
    }
    Voici mon problème :
    Lorsque je met mon sample rate (via mon objet _audioFormat) à 8000, tout fonctionne parfaitement. Speex encode et décode parfaitement puis je recois bien le microphone sur le haut parleur.
    Puis je change le sample rate pour passer à du 22050 car on micro supporte seulement : (8000, 11025, 22050, 44100, 48000, 96000).
    J'ai essayé avec 48000, 44100 etc.... rien à faire.
    Le son est complètement saccadé et cassé avec des bruits bizarres.

    Qu'en pensez-vous ?
    Avez-vous une idée de solution ?

    Merci,

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Juillet 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    J'ai du nouveau
    J'ai cherché (beaucoup) et j'ai testé en mettant mon QAudioFormat à 16000 pour le sample rate.
    J'ai ensuite testé les 3 modes de Speex. En théorie, sur leur page le 16000 correspond au Wideband :/
    A ma grande surprise, ça marche avec du UltraWideband.
    Et lorsque je met mon SampleRate de mon QAudioFormat à 8000, je dois mettre Speex en WideBande alors qu'en théorie cela correspond au NarrowBand.

    (Les 3 modes : NarrowBand -> 8000, WideBand -> 16000, UltraWideBand -> 32000)

    Mon problème à changé : Je cherche maintenant à rendre compatible Speex avec mon QAudioFormat modifié à 32000.
    Là ducoup ça ne marche pas, il faudra du SuperUltraWideBand si on suit mon problème ^^
    Avez-vous une idée ?

Discussions similaires

  1. Google invite à utiliser son nouveau codec VP9
    Par Stéphane le calme dans le forum Actualités
    Réponses: 8
    Dernier message: 08/04/2015, 00h01
  2. probleme d'utilisation avec les lib speex et portaudio
    Par keenusa dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 18/12/2010, 01h17
  3. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 13h36
  4. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 17h01
  5. Réponses: 2
    Dernier message: 21/03/2002, 00h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo