2012-03-31 14 views
0

Ich möchte Daten mit libspeex codieren. Jedoch gibt speex_encode_int() immer eine SpeexBits der Länge 70. Es ist egal, was ich zur Verfügung stelle (Musik, Stille, Stimme).speex_encode_int() gibt immer 70 codierte output Bytes zurück

Eingangsspezifikation: 16bit, PCM, Mono, 44100 Hz Abtastrate, 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); 

Habe ich einen Fehler in meiner Codierung Routine machen? Oder stimmt irgendetwas mit meiner Initialisierung nicht?

Antwort

2

Nun, Sie verwenden Qualität 8, die 27,8 kb/s für Breitband ist, die aufgerundet ist 70 Bytes/Frame. Ich bin mir nicht sicher, was Sie erwarten. Das Ändern des Qualitätsparameters sollte Ihnen mehr Bytes oder weniger Bytes geben (abhängig von dem Wert, den Sie wählen). Außerdem wird unter Verwendung von 44,1 kHz nicht empfohlen. Sie sollten Breitband (16 kHz) verwenden. Alternativ können Sie sich den Opus-Codec ansehen.