2012-03-31 5 views
0

私はlibspeexでデータをエンコードしたいと思います。ただし、speex_encode_int() は、常に長さ70のSpeexBitsを返します。私が提供するもの(音楽、無音、声)は関係ありません。speex_encode_int()は常に70エンコードの出力バイトを返します

入力仕様:16ビット、PCM、モノラル、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); 

は、私は私のエンコーディングルーチンでエラーを行いましたか?それとも、私の初期設定に何か問題がありますか?

答えて

2

さて、あなたはワイドバンド用に27.8 kb/sの品質8を使用していますが、切り上げは70バイト/フレームです。私はあなたが何を期待するか分からない。 qualityパラメータを変更すると、選択した値に応じて、より多くのバイト数またはより少ないバイト数が与えられます。また、44.1kHzはで、を推奨しません。広帯域(16 kHz)を使用する必要があります。また、Opusコーデックを見ることもできます。

関連する問題