speex_encode_int()始终返回70个编码输出字节

时间:2012-03-31 08:13:44

标签: c speex

我想用libspeex编码数据。但是,speex_encode_int()  总是返回长度为70的SpeexBits。无论我提供什么(音乐,沉默,声音)都无关紧要。

输入规格:16bit,PCM,Mono,44100Hz采样率,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 个答案:

答案 0 :(得分:2)

嗯,你使用的是质量8,宽带为27.8 kb / s,向上舍入为70字节/帧。我不确定你的期望。更改质量参数应该为您提供更多字节或更少字节(取决于您选择的值)。此外,建议使用44.1 kHz not 。您应该使用宽带(16 kHz)。或者,您可以查看Opus编解码器。