speex和jspeex解码

时间:2013-01-24 20:36:09

标签: android decoding speex jspeex

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不匹配。

对不起我真棒(?)的英语,提前谢谢。

1 个答案:

答案 0 :(得分: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 tho。

的数量