0

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

入力仕様: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);

エンコーディング ルーチンでエラーが発生しましたか? それとも私の初期化に何か問題がありますか?

4

1 に答える 1

2

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

于 2012-04-09T18:12:51.823 に答える