0

私は、入出力としてremoteIOオーディオユニットを使用してSpeexオーディオをエンコードおよびデコードする必要があるiOSプロジェクトに取り組んでいます。

私が抱えている問題は、speexはエラーを出力しませんが、私が得るオーディオは音声としていくらか認識できますが、非常に歪んでいて、ゲインがロボットの方法でクランクアップされたような音です。

エンコードおよびデコード関数は次のとおりです(エンコードする入力はオーディオユニットレンダリング関数からの320バイトの符号付き整数、デコードする入力は62バイトの圧縮データです):

#define AUDIO_QUALITY 10
#define FRAME_SIZE 160
#define COMP_FRAME_SIZE 62

char *encodeSpeexWithBuffer(spx_int16_t *buffer, int *insize) {
    SpeexBits bits;
    void *enc_state;



    char *outputBuffer = (char *)malloc(200);

    speex_bits_init(&bits);
    enc_state = speex_encoder_init(&speex_nb_mode);

    int quality = AUDIO_QUALITY;

    speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &quality);


    speex_bits_reset(&bits);

    speex_encode_int(enc_state, buffer, &bits);



    *insize = speex_bits_write(&bits, outputBuffer, 200);


    speex_bits_destroy(&bits);
    speex_encoder_destroy(enc_state);


    return outputBuffer;
}

short *decodeSpeexWithBuffer(char *buffer) {
    SpeexBits bits;
    void *dec_state;

    speex_bits_init(&bits);

    dec_state = speex_decoder_init(&speex_nb_mode);

    short *outTemp = (short *)malloc(FRAME_SIZE * 2);

    speex_bits_read_from(&bits, buffer, COMP_FRAME_SIZE);
    speex_decode_int(dec_state, &bits, outTemp);

    speex_decoder_destroy(dec_state);
    speex_bits_destroy(&bits);


    return outTemp;
}

そして、オーディオユニットのフォーマット:

// Describe format
audioFormat.mSampleRate         = 8000.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        =  kAudioFormatFlagIsSignedInteger |
kAudioFormatFlagsNativeEndian |
kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 16;
audioFormat.mBytesPerPacket     = 2;
audioFormat.mBytesPerFrame      = 2;

エラーはどこにも報告されておらず、AudioUnitが8000のサンプルレートで処理していることを確認しました

4

1 に答える 1

0

これに夢中になって数日後、私はついにそれを理解しました。Speexの秘訣は、SpeexBitとエンコーダーvoid *を初期化し、セッション全体でそれらを使用する必要があることです。エンコードのすべての部分に対してそれらを再作成していたため、奇妙なサウンドの結果が発生していました。

引っ越したら:

 speex_bits_init(&bits);
 enc_state = speex_encoder_init(&speex_nb_mode);

whileループからは、すべてがうまく機能しました。

于 2012-07-17T17:14:40.797 に答える