2013-01-24 94 views
1

Jspeex具有解码的方法,如下所示:的Speex和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 wrapper来使用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不匹配。

对不起,我的真棒(?)英语,在此先感谢。

回答

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的编号。