speex_encode_int () всегда возвращает 70 закодированных выходных байтов - PullRequest
0 голосов
/ 31 марта 2012

Я бы хотел закодировать данные с помощью libspeex.Однако speex_encode_int() всегда возвращает SpeexBits длины 70. Неважно, что я предоставляю (музыка, тишина, голос).

Характеристики ввода: 16 бит, PCM, моно, частота дискретизации 44100 Гц,LE

int tmp;
short *input = ...; // input data (PCM, 16bit)
int inputFrames = ...; // number of frames
void *state;
SpeexBits bits;
int frameSize;
int bufferLength;
void* output = NULL;
int outputLength = 0;
int i;

state = speex_encoder_init(&speex_wb_mode);
tmp = 8;
speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);
speex_encoder_ctl(state, SPEEX_GET_FRAME_SIZE, &frameSize);
tmp = 44100;
speex_encoder_ctl(state, SPEEX_SET_SAMPLING_RATE, &tmp);
speex_bits_init(&bits);


for(i = 0; i < (inputFrames / frameSize); i++){
    speex_bits_reset(&bits);
    speex_encode_int(state, &input[i * frameSize], &bits);
    bufferLength = speex_bits_nbytes(&bits);
    output = realloc(output, outputLength + bufferLength);
    speex_bits_write(&bits, (char*)(output + outputLength), bufferLength);
    outputLength += bufferLength;
}

// process output data    

free(output);
free(input);

Я сделал ошибку в моей программе кодирования?Или что-то не так с моей инициализацией?

1 Ответ

2 голосов
/ 09 апреля 2012

Ну, вы используете качество 8, которое составляет 27,8 кбит / с для широкополосного, а округленное до 70 байт / кадрЯ не уверен, что вы ожидаете.Изменение параметра качества должно дать вам больше байтов или меньше байтов (в зависимости от выбранного значения).Кроме того, использование 44,1 кГц не рекомендуется .Вы должны использовать широкополосный (16 кГц).Кроме того, вы можете взглянуть на кодек Opus.

...