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 と一致しませんでした。
私のすばらしい(?)英語で申し訳ありませんが、よろしくお願いします。