2012-02-01 53 views
13

Ai cũng có thể giúp tôi trên cách sử dụng speex hoặc jspeex trong android?hỗ trợ speex trong android

Tôi đã tìm kiếm rất nhiều nhưng không thể tìm thấy ở bất cứ đâu. Có nhiều vấn đề liên quan đến điều này trong code.google.com/android nhưng không có câu trả lời nào được trả lời. Ở đây cũng câu hỏi này đã không có một phản ứng tốt như câu hỏi khác của tôi liên quan đến điều này là Decoding speex encoded byte array in Android. Vì vậy, nếu bạn biết một cái gì đó về điều này sau đó xin vui lòng cung cấp cho tôi thông tin về việc này.

Tôi cần mã hóa và giải mã mã vạch bằng cách sử dụng bộ giải mã này.

Tôi đã thử Android-ndk and got encoding done, nhưng gặp sự cố khi giải mã mảng byte. Có cách nào khác để đạt được điều này không?

EDIT

Chức năng mã hóa của tôi trong tập tin c có nguồn gốc như sau:

#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; 
} 

bây giờ cho giải mã tôi đang gửi các mảng ngắn chuyển đổi sang chức năng giải mã như sau:

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; 
} 

Chức năng mã hóa của tôi đang hoạt động tốt, ví dụ được cung cấp trên blog A JNI Wrapper for Speex on Android

Một nỗ lực để giải mã bằng cách truyền mảng char và trở về mảng ngắn gọn là như sau:

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; 
} 

kết quả là

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) 
+0

Sự cố bạn gặp phải là gì? – nos

+0

Tôi có một hàm mã hóa trả về một mảng các byte vì vậy tôi phải chuyển mảng byte thành hàm giải mã nhưng hàm 'speex_bits_read_from' lấy mảng char trong đối số của nó. –

+0

@ tôi đã thêm mã của mã gốc. hãy nhìn cái này –

Trả lời

3

speex_bits_reset làm sau trong cơ thể của nó:

bits->nbBits=0; 

và speex_bits_nbytes trả về ((bit-> nbBits + 7) >> 3); Vì vậy, nếu bạn gọi speex_bits_nbytes ngay sau khi speex_bits_reset, bạn luôn nhận được 0. Vì vậy, bạn phải gọi speex_bits_read_from trước khi phân bổ mảng:

/*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; 
1

Không biết về mã đặc biệt , nhưng có một vài ứng dụng Android nguồn mở ngoài đó bao gồm hỗ trợ speex, mà bạn có thể sử dụng làm tài liệu tham khảo:

0

tín hiệu Fatal 11 (SIGSEGV) tại 0x00000018 (mã = 1) Lỗi đến, khi u có không reinitialize bộ giải mã

decod_state = speex_decoder_init(&speex_wb_mode); 

và cố gắng sử dụng dữ liệu khung giải mã, ..

đừng quên gọi phương thức initDecode() của bạn từ java trước và sau đó giải mã khung