raneezn at icare4u.frih.org
2012-Mar-14 16:02 UTC
[Speex-dev] Audio file is corrupted after decoding
I successfully encoded and decoded a wav file of PCM 16 , MONO and with sample rate 8000 in Android OS. The size of the original wav file and decoded file is near. But i am not able to play the decoded audio file, the mediaplayer says that the file has been corrupted. ENCODING: #include <jni.h> #include <stdio.h> #include "speex/speex.h" #define FRAME_SIZE 320 void Java_com_m2_iSmartDm_ISmartDMActivity_spxEnc(JNIEnv * env, jobject jobj,jstring dir1,jstring dir2) { const char *inFile= (*env)->GetStringUTFChars(env,dir1,0); const char *outFile= (*env)->GetStringUTFChars(env,dir2,0); FILE *fin; FILE *fout; short in[FRAME_SIZE]; float input[FRAME_SIZE]; char cbits[360]; int nbBytes; void *state; SpeexBits bits; int i, tmp; state = speex_encoder_init(&speex_wb_mode); tmp=8; speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); fin = fopen(inFile, "r"); fout=fopen(outFile,"w"); speex_bits_init(&bits); int bool=1; while (!feof(fin)) { if(bool==1) { /* skip wav header */ fseek ( fin , 44 , SEEK_SET ); bool=0; } /*Read a 16 bits/sample audio frame*/ fread(in, sizeof(short), FRAME_SIZE, fin); if (feof(fin)) break; speex_bits_reset(&bits); speex_encode_int(state, in, &bits); nbBytes = speex_bits_write(&bits, cbits, 360); fwrite(&nbBytes, sizeof(int), 1, fout); /*Write the compressed data*/ fwrite(cbits, 1, nbBytes, fout); } speex_encoder_destroy(state); speex_bits_destroy(&bits); fclose(fin); fclose(fout); } DECODING: #include <jni.h> #include <stdio.h> #include "speex/speex.h" #define FRAME_SIZE 320 void Java_com_m2_iSmartDm_ISmartDMActivity_spxDec(JNIEnv * env, jobject jobj,jstring dir1,jstring dir2) { const char *inFile= (*env)->GetStringUTFChars(env,dir1,0); const char *outFile= (*env)->GetStringUTFChars(env,dir2,0); FILE *fin; FILE *fout; short out[FRAME_SIZE]; short output[FRAME_SIZE]; char cbits[360]; int nbBytes; void *state; SpeexBits bits; int i, tmp; jbyteArray bytes; state = speex_decoder_init(&speex_wb_mode); tmp=1; speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); fin = fopen(inFile, "r"); fout=fopen(outFile,"w"); speex_bits_init(&bits); while (!feof(fin)) { fread(&nbBytes, sizeof(int), 1, fin); if (feof(stdin)) break; fread(cbits, 1, nbBytes, fin); speex_bits_read_from(&bits, cbits, nbBytes); speex_decode_int(state, &bits, output); fwrite(output, sizeof(short), FRAME_SIZE, fout); } speex_decoder_destroy(state); speex_bits_destroy(&bits); fclose(fout); fclose(fin); } -------------- next part -------------- A non-text attachment was scrubbed... Name: spx_enc.c Type: application/octet-stream Size: 1398 bytes Desc: not available Url : http://lists.xiph.org/pipermail/speex-dev/attachments/20120314/a1cd9577/attachment.obj -------------- next part -------------- A non-text attachment was scrubbed... Name: spx_dec.c Type: application/octet-stream Size: 1167 bytes Desc: not available Url : http://lists.xiph.org/pipermail/speex-dev/attachments/20120314/a1cd9577/attachment-0001.obj