Portaudio + Opus кодирование / декодирование аудио входа

Я работаю над VOIP-клиентом, используя Portaudio и opus.
Читаю с микрофона в рамке
-кодировать каждый кадр с помощью Opus и поместить его в список
-поп первый элемент из списка и декодировать его
-читай это с помощью portaudio

Если я делаю то же самое без кодирования моего звука, это прекрасно работает. Но когда я использую Opus, у меня плохой звук, я не могу понять голос (что плохо для VoIP-клиента)

HandlerOpus::HandlerOpus(int sample_rate, int num_channels)
{
this->num_channels = num_channels;
this->enc = opus_encoder_create(sample_rate, num_channels, OPUS_APPLICATION_VOIP, &this->error);
this->dec = opus_decoder_create(sample_rate, num_channels, &this->error);

opus_int32 rate;

opus_encoder_ctl(enc, OPUS_GET_BANDWIDTH(&rate));
this->encoded_data_size = rate;
}

HandlerOpus::~HandlerOpus(void)
{
opus_encoder_destroy(this->enc);
opus_decoder_destroy(this->dec);
}

unsigned char *HandlerOpus::encodeFrame(const float *frame, int frame_size)
{
unsigned char *compressed_buffer;
int ret;

compressed_buffer = new (unsigned char[this->encoded_data_size]);
ret = opus_encode_float(this->enc, frame, frame_size, compressed_buffer, this->encoded_data_size);
return (compressed_buffer);
}

float *HandlerOpus::decodeFrame(const unsigned char *data, int frame_size)
{
int ret;
float *frame = new (float[frame_size * this->num_channels]);

opus_packet_get_nb_channels(data);
ret = opus_decode_float(this->dec, data, this->encoded_data_size, frame, frame_size, 0);
return (frame);
}

Я не могу изменить библиотеку, я должен использовать Opus.
Частота дискретизации составляет 48000, а количество кадров в буфере — 480, и я попробовал моно и стерео.

Что я делаю неправильно?

5

Решение

Я решил проблему сам, я изменил конфигурацию: частота дискретизации до 24000, а количество кадров в буфере равно 480.

1

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

Это 6 лет спустя, но я опубликую ответ для будущих гуглеров, таких как я:

У меня была очень похожая проблема, и я исправил ее, изменив тип образца PortAudio на paInt32 и переключившись с opus_decode_float на просто opus_decode

0

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