android中的speex支持

有人可以帮助我

我进行了很多搜索,但找不到任何地方。code.google.com/

android中与此相关的问题很多,但都没有答案。这里的这个问题也没有得到很好的回答,因为我对此的另一个问题是Android中的解码speex编码的字节数组。因此,如果您对此有所了解,请向我提供有关此信息。

我需要使用此编解码器对音频文件的字节数组进行编码和解码。

我已经尝试过Android-ndk并完成了编码,但是 遇到了

还有其他替代方法可以做到这一点吗?

我在本机c文件中的编码函数如下:

#include <jni.h>

#include "speex/speex.h"

#define FRAME_SIZE 320

int nbBytes;

/*Holds the state of the encoder*/

void *state;

void *decod_state;

/*Holds bits so they can be read and written to by the Speex routines*/

SpeexBits decod_bits;

SpeexBits bits;

int i, tmp;

void Java_com_mycom_speex_SpeexEncodingActivity_init(JNIEnv * env, jobject jobj) {

/*Create a new encoder state in narrowband mode*/

state = speex_encoder_init(&speex_wb_mode);

/*Set the quality to 8*/

tmp=8;

speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);

/*Initialization of the structure that holds the bits*/

speex_bits_init(&bits);

}

jbyteArray Java_com_mycom_speex_SpeexEncodingActivity_encode(JNIEnv * env, jobject jobj, jshortArray inputData) {

jbyteArray ret;

jshort * inputArrayElements = (*env)->GetShortArrayElements(env, inputData, 0);

/*Flush all the bits in the struct so we can encode a new frame*/

speex_bits_reset(&bits);

/*Encode the frame*/

speex_encode_int(state, inputArrayElements, &bits);

/*Copy the bits to an array of char that can be written*/

nbBytes = speex_bits_nbytes(&bits);

ret = (jbyteArray) ((*env)->NewByteArray(env, nbBytes));

jbyte * arrayElements = (*env)->GetByteArrayElements(env, ret, 0);

speex_bits_write(&bits, arrayElements, nbBytes);

(*env)->ReleaseShortArrayElements(env, inputData, inputArrayElements, JNI_ABORT);

(*env)->ReleaseByteArrayElements(env, ret, arrayElements, 0);

return ret;

}

现在进行解码,我将转换后的短数组发送给

void Java_com_mycom_speex_SpeexEncodingActivity_initDecode(JNIEnv * env,

jobject jobj) {

decod_state = speex_decoder_init(&speex_wb_mode);

tmp = 1;

speex_decoder_ctl(decod_state, SPEEX_SET_ENH, &tmp);

/*Initialization of the structure that holds the bits*/

speex_bits_init(&decod_bits);

}

jshortArray Java_com_mycom_speex_SpeexEncodingActivity_decode(JNIEnv * env,

jobject jobj, jshortArray inputData) {

jshort * inputArrayElements = (*env)->GetShortArrayElements(env, inputData,

0);

/*Flush all the bits in the struct so we can decode a new frame*/

speex_bits_reset(&decod_bits);

/*Copy the bits to an array of char that can be written*/

nbBytes = speex_bits_nbytes(&decod_bits);

speex_bits_read_from(&decod_bits,inputArrayElements, nbBytes); // here it requires char * in second argument

/*Decode the frame*/

speex_decode_int(decod_state, &decod_bits, inputArrayElements);

(*env)->ReleaseShortArrayElements(env, encodedData, inputArrayElements,

JNI_ABORT);

return inputArrayElements;

}

我的编码功能运行良好,该示例在博客上提供。Android上用于Speex的JNI包装器

jshortArray Java_com_mycom_speex_SpeexEncodingActivity_decode(JNIEnv * env,

jobject jobj, jcharArray inputCharData) {

jshortArray ret;

jchar * inputArrayElements = (*env)->GetCharArrayElements(env,

inputCharData, 0);

/*Flush all the bits in the struct so we can decode a new frame*/

speex_bits_reset(&decod_bits);

/*Copy the bits to an array of char that can be written*/

nbBytes = speex_bits_nbytes(&decod_bits);

ret = (jshortArray)((*env)->NewShortArray(env, nbBytes));

jshort * arrayElements = (*env)->GetShortArrayElements(env, ret, 0);

speex_bits_read_from(&decod_bits,(char *) inputArrayElements, nbBytes);

/*Decode the frame*/

speex_decode_int(decod_state, &decod_bits, arrayElements);

(*env)->ReleaseCharArrayElements(env, inputCharData, inputArrayElements,

JNI_ABORT);

(*env)->ReleaseShortArrayElements(env, ret, arrayElements, 0);

return ret;

}

结果是

Returned empty array of short if i return ret and if i return arrayElements it 

gives an error Fatal signal 11 (SIGSEGV) at 0x00000018 (code=1)

回答:

speex_bits_reset在其主体中执行以下操作:

bits->nbBits=0;

speex_bits_nbytes返回((bits-> nbBits + 7)>> 3);

因此,如果在speex_bits_reset之后立即调用speex_bits_nbytes,则始终会收到0。因此,必须在分配数组之前调用speex_bits_read_from:

/*Flush all the bits in the struct so we can decode a new frame*/

speex_bits_reset(&decod_bits);

/*Read bits in decod_bits struct from java array*/

speex_bits_read_from(&decod_bits,(char *) inputArrayElements, nbBytes);

/*Copy the bits to an array of char that can be written*/

nbBytes = speex_bits_nbytes(&decod_bits);

ret = (jshortArray)((*env)->NewShortArray(env, nbBytes));

jshort * arrayElements = (*env)->GetShortArrayElements(env, ret, 0);

/*Decode the frame*/

speex_decode_int(decod_state, &decod_bits, arrayElements);

(*env)->ReleaseCharArrayElements(env, inputCharData, inputArrayElements,

JNI_ABORT);

(*env)->ReleaseShortArrayElements(env, ret, arrayElements, 0);

return ret;

以上是 android中的speex支持 的全部内容, 来源链接: utcz.com/qa/408961.html

回到顶部