C ++ Запись аудио и сжатие в GSM

Я работаю над программой на C ++, которая записывает аудио и сжимает его в GSM. Я могу записывать аудио и записывать необработанные данные в файл. Но я не могу заставить работать сжатие GSM. Я пытаюсь использовать исходный код для сжатия, который я нашел на этом сайте ftp://ftp.cs.cmu.edu/project/fgdata/speech-compression/GSM/gsm_13200bps.

Я думаю, что моя проблема заключается в использовании функции gsm_encode (). После кодирования и сохранения сжатых данных в файл при воспроизведении этого файла он не слышен. Я знаю, что исходные аудиоданные верны, но сжатые аудиоданные неверны.

gsm_encode () кодирует массив из 160 13-битных выборок (определяется как
gsm_signal’s, целочисленные значения со знаком не менее 16 бит) в
gsm_frame из 33 байтов.

Вот моя функция, я отправляю данные в gsm_encode () неправильно? Или есть другая проблема с моей функцией? Спасибо за помощь 🙂

int CAudioGSM::CompressAudio(unsigned char * pRawBuffer, _int32 uiRawBufferSize, unsigned char  * pCompressedBuffer, _int32 uiCompressedBufferSize)
{
// Note: uiRawBufferSize must be a multiple of 640 (AUDIO_DMA_DESCRITOR_LEN)
if(!pRawBuffer || uiRawBufferSize == 0 || !pCompressedBuffer || uiCompressedBufferSize == 0 ||  uiRawBufferSize % AUDIO_DMA_DESCRITOR_LEN != 0)
{
return -1; //invalid parameters
}

_int32 uiBytesCompressed = 0; // Number of bytes that have been compressed. At the end of the function this should be equal to iRawBufferSize meaning we have compressed the whole raw buffer
_int32 uiCompBuffOffset = 0; // Offset into the compressed buffer

while(uiBytesCompressed < uiRawBufferSize)
{
if(uiCompressedBufferSize - uiCompBuffOffset < GSM_OUTPUT_SIZE || uiCompBuffOffset >= uiCompressedBufferSize)
{
return -2; // Compressed buffer is too small
}

gsm_encode(&m_GSM_EncodeStruture,(long *)pRawBuffer,m_Buffer);
//Now we need to move the data to compressed buffer
if(m_bFirstHalfOfBlockRecord)
{
//Just copy the data over
memcpy(&pCompressedBuffer[uiCompBuffOffset],m_Buffer,GSM_OUTPUT_SIZE_FIRST_HALF);
m_bFirstHalfOfBlockRecord = false;
uiCompBuffOffset += GSM_OUTPUT_SIZE_FIRST_HALF;
}
else
{
memcpy(&pCompressedBuffer[uiCompBuffOffset],m_Buffer,GSM_OUTPUT_SIZE);
m_bFirstHalfOfBlockRecord = true;
uiCompBuffOffset += GSM_OUTPUT_SIZE;
}

uiBytesCompressed += AUDIO_DMA_DESCRITOR_LEN;
}

return uiCompBuffOffset; // Success, we have compressed the buffer return compressed data size
}

1

Решение

несмотря на это, я понял это, pRawBuffer никогда не увеличивается, это должно быть

gsm_encode(&m_GSM_EncodeStruture,(long *)&pRawBuffer[uiBytesCompressed],m_Buffer);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]