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)
Sự cố bạn gặp phải là gì? – nos
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ó. –
@ tôi đã thêm mã của mã gốc. hãy nhìn cái này –