2012-03-05 5 views
0

Android IOS에서 wav 파일의 인코딩/디코딩을하고 있습니다.speex JNI 인코딩 디코드 오디오가 잡음이되었습니다

나는 speex로 인코딩 된 파일을 디코딩 한 후 파일을 재생할 때 완전히 잡음이되고 말 내용이 없습니다.

여기에 대한 인코딩/디코딩 코드가 있습니다.

#include <jni.h> 
#include "speex/speex.h" 
#include <stdio.h> 
#include <android/log.h> 
#define FRAME_SIZE 160 
#define DEBUG_TAG "NDK_TEST_LOG" 
int nbBytes = 0; 
/*Holds the state of the encoder*/ 
void *enc_state; 
void *dec_state; 
/*Holds bits so they can be read and written to by the Speex routines*/ 
SpeexBits bits; 
int i, tmp, j; 
char cbits[200]; 
short in_short[FRAME_SIZE]; 
short out_short[FRAME_SIZE]; 
int frame_size = 0; 

int codec_open = 0; 

int dec_frame_size; 
int enc_frame_size; 

SpeexBits ebits, dbits; 
void *enc_state1; 
void *dec_state1; 

void Java_com_argusoft_JNI2Activity_init(JNIEnv * env, jobject jobj) { 
    /*Initialization of the structure that holds the bits for speex*/ 
    speex_bits_init(&bits); 
    /*Create a new encoder state in narrowband mode*/ 
    enc_state = speex_encoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); 
    /*Set the quality to 1*/ 
    speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size); 
    /*set speex controller */ 
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG," Encode FRAME SIZE : %d", frame_size); 
    tmp = 0; 
    speex_encoder_ctl(enc_state, SPEEX_SET_VBR, &tmp); 
    tmp = 8; 
    speex_encoder_ctl(enc_state, SPEEX_SET_QUALITY, &tmp); 
    tmp = 1; 
    speex_encoder_ctl(enc_state, SPEEX_SET_COMPLEXITY, &tmp); 
} 
void Java_com_argusoft_JNI2Activity_init1(JNIEnv * env, jobject jobj) { 
    speex_bits_init(&bits); 
    dec_state = speex_decoder_init(speex_lib_get_mode(SPEEX_MODEID_NB)); 
    tmp = 0; 
    speex_encoder_ctl(dec_state, SPEEX_SET_VBR, &tmp); 
    tmp = 8; 
    speex_encoder_ctl(dec_state, SPEEX_SET_QUALITY, &tmp); 
    tmp = 1; 
    speex_encoder_ctl(dec_state, SPEEX_SET_COMPLEXITY, &tmp); 
} 
jbyteArray Java_com_argusoft_JNI2Activity_encode1(JNIEnv * env, jobject jobj,jshortArray inputData) { 
    jbyteArray ret; 
    jshort * inputArrayElements = (*env)->GetShortArrayElements(env, inputData,0); 
    speex_bits_reset(&bits); 
    jsize len = (*env)->GetArrayLength(env, inputData); 
    speex_encode_int(enc_state, inputArrayElements, &bits); 
    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; 
} 

jshortArray Java_com_argusoft_JNI2Activity_decode1(JNIEnv * env, jobject jobj,jbyteArray in) { 
    jshortArray returnVal; 
    speex_bits_reset(&bits); 
    jbyte * arrayElements = (*env)->GetByteArrayElements(env, in, 0); 
    jsize len = (*env)->GetArrayLength(env, in); 
    returnVal = ((*env)->NewShortArray(env, frame_size)); 
    jshort * outputArrayElements = (*env)->GetShortArrayElements(env,returnVal, 0); 
    speex_bits_read_from(&bits, arrayElements, (len)); 
    (*env)->ReleaseShortArrayElements(env, returnVal, outputArrayElements,JNI_ABORT); 
    (*env)->ReleaseByteArrayElements(env, in, arrayElements, 0); 

    return returnVal; 
} 

아무도 도와 드릴까요,이 문제를 해결할 수 있습니까? 감사합니다 & 안부.

답변