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;
}
作为输入,我给出了一个长度不确定的字节数组,但方法只是正确地填充了我的输出缓冲区。换句话说,我给出了一堆彼此相邻的帧,但是解码器可以处理连续的帧。但是有些机器速度很慢,所以我决定将 speex 与 jni 包装器一起使用。同样,我们有一个方法如下所示:
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 不匹配。
对不起我的真棒(?)英语,提前谢谢。