1

Jspeex には、以下に示すようにデコードするメソッドがあります。

 public static int decode(byte[] input, int offset, int length, byte[] output) throws StreamCorruptedException {

    SpeexDecoder decoder = new SpeexDecoder();
    decoder.init(0, 8000, 1, true, length);
    decoder.bits.read_from(input, offset, length);
    int o_offset = 0;
    while ( decoder.bits.getBufferSize() < length )
    {
        decoder.decodeToByteArray(output, o_offset);
        o_offset += 320;
    }

    return o_offset;
}

入力として、長さが定かではないバイトの配列を指定していますが、メソッドは出力バッファを適切に埋めるだけです。言い換えれば、私は互いに隣り合ったフレームの束を与えていますが、デコーダーは連続したフレームで問題ありません。ただし、一部のマシンは遅いため、jni ラッパーで speex を使用することにしました。同様に、以下に示すメソッドがあります。

public short[] decode(byte[] frame)
{
    return decode(slot, frame);
}

private native static short[] decode(int slot, byte[] frame);

上記の jni ラップ デコード メソッドは、単一フレームのみを受け入れます。私の質問は、jni でラップされた speex を使用して、jspeex でまったく同じことを行うにはどうすればよいかということです。

PS: 連続するフレームを個々のフレームに分割しようとしましたが、連続するフレームの長さが number_of_frames X length_of_a_frame と一致しませんでした。

私のすばらしい(?)英語で申し訳ありませんが、よろしくお願いします。

4

1 に答える 1

0

同じ問題に直面している場合は、次のようにします。jni 内で実行することをお勧めします。

for(int i=0;i<frames;i++) {
    if(speex_decode_int(dec_state, &dbits, output_buffer+i*dec_frame_size)!=0) {
        __android_log_print(ANDROID_LOG_ERROR, "Speex_jni", "Error in decoding");
        return (jint)0;
    }
}

あなたはトーの数を知る必要がありますframes

于 2015-09-09T16:18:07.850 に答える