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
J'utilise la classe QAudioInput et QAudioOutput pour me "connecter" à mon micro et mes hauts parleurs.
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);
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:
TEST::inputReadyRead(QIODevice *io) est un slot qui est appelé à chaque fois que des données à lire son disponibles.
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()); }
Mon problème est lorsque j'utilise ce code au lieu de celui juste au dessus:
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 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 mon problème :
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); }
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,
Partager