OPUS декодирует необработанные данные PCM

Я пытаюсь сжать и распаковать необработанный PCM (16-битный) звук, используя OPUS.
Здесь ниже мой код для opus_encoder.c. Если я удаляю свой decoder.c, буфер работает просто отлично, так как микрофон может принимать необработанные данные PCM. Однако, как только я реализовал свой класс декодера, он дал мне много ошибок, таких как выделение памяти, повреждение кучи и так далее. Вот некоторые из моих ошибок:

std :: bad_alloc в ячейке памяти 0x0031D4BC

Переполнение стека (параметры: 0x00000000, 0x05122000)

Место чтения нарушения доступа 0x04A40000.

Исходя из моего понимания, я думаю, что мой размер декодера не может правильно распределить память. Можете ли вы взглянуть на мои коды и посмотреть, что пошло не так?

Opus_encoder.c

#include "opusencoder.h"#include <QtConcurrent/QtConcurrent>

opusencoder::opusencoder(){
}

opusencoder::~opusencoder(){
}

OpusEncoder *enc;
int error;
unsigned char *compressedbuffer;
opus_uint32 enc_final_range;
short pcm = 0;

unsigned char *opusencoder::encodedata(const char *audiodata, const unsigned int& size) {if (size == 0)
return false;

enc = (OpusEncoder *)malloc(opus_encoder_get_size(1));

enc = opus_encoder_create(8000, 1, OPUS_APPLICATION_VOIP, &error);
if (enc == NULL)
{
exit;
}

opus_int32 rate;
opus_encoder_ctl(enc, OPUS_GET_BANDWIDTH(&rate));
this->encoded_data_size = rate;int len;for (int i = 0; i < size / 2; i++)
{

//combine pairs of bytes in the original data into two-byte number
//convert const char to short

pcm= audiodata[2 * i] << 8 | audiodata[(2 * i) + 1];}

qDebug() << "audiodata: " << pcm << endl;

compressedbuffer = new (unsigned char[this->encoded_data_size]);len = opus_encode(enc, &pcm, 320, compressedbuffer, this->encoded_data_size);

len = opus_packet_unpad(compressedbuffer, len);
len++;if (len < 0)
{
qDebug() << "Failure to compress";
return NULL;

}qDebug() << "COmpressed buffer:" << compressedbuffer << endl;

qDebug() << "opus_encode() ................................ OK.\n" << endl;

}

Opus_decoder.c

##include "opusdecoder.h"#include <QtConcurrent/QtConcurrent>
#define OPUS_CLEAR(dst, n) (memset((dst), 0, (n)*sizeof(*(dst))))
int num_channels = 1;

opusdecoder::opusdecoder(){
}
opusdecoder::~opusdecoder(){
}

opus_int16* opusdecoder::decodedata(int frame_size, const unsigned char *data)
{
dec = opus_decoder_create(8000, 1, &err);

if (dec == NULL)
{
exit;
}opus_int32 rate;
opus_decoder_ctl(dec, OPUS_GET_BANDWIDTH(&rate));
rate = decoded_data_size;

this->num_channels = num_channels;int decodedatanotwo;
opus_int16 *decompress = new (opus_int16[frame_size * this->num_channels]);
opus_packet_get_nb_channels(data);decodedatanotwo= opus_decode(dec, data, this->decoded_data_size, decompress, 320, 0);if (decodedatanotwo < 0)
{
qDebug() << "Failure to decompress";
return NULL;}qDebug() << "opus_decode() ................................ OK.\n" << decodedatanotwo << endl;

if (decodedatanotwo != frame_size)
{
exit;
}}

0

Решение

Задача ещё не решена.

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

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

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