[Speex-dev] just noise
zmorris at mac.com
zmorris at mac.com
Sat Apr 21 11:36:04 PDT 2007
Hi, I tried both the stable and beta versions of the speex source
code download on Mac OS 10.4.9. I just do:
./configure
make
sudo make install
Then I added libspeex.a from /usr/local/lib and the headers to my
xcode project. My app compiles and I'm able to call all of the speex
functions. I copied the example code from the website and tweaked it
to include the first 10000 bytes of the female.wav file (to include
the header).
However, when I play the output file, I get the header and a second
of audio, but the rest is just noise. I've stared at it for hours
and tried every combination of quality settings but it just doesn't
work. Can someone please tell me what I am doing wrong? Thanx, and
here is the code:
--Zack
////////////////////////////////////////
#include "speex/speex.h"
#include <stdio.h>
#define FRAME_SIZE 160
int main( void )
{
char *inFile = "female.wav";
char *tempFile = "compressed.wav";
char *outFile = "speex-result.wav";
FILE *fin;
FILE *fout;
char header[10000]; // storage for wav header
short in[FRAME_SIZE];
float input[FRAME_SIZE];
/*Holds the audio that will be written to file (16 bits per sample)*/
short out[FRAME_SIZE];
/*Speex handle samples as float, so we need an array of floats*/
float output[FRAME_SIZE];
char cbits[200];
int nbBytes;
/*Holds the state of the encoder*/
void *state;
/*Holds bits so they can be read and written to by the Speex routines*/
SpeexBits bits;
int i, tmp;
//////////////////// encoder ////////////////////
/*Create a new encoder state in narrowband mode*/
state = speex_encoder_init(&speex_nb_mode);
/*Set the quality to 8 (15 kbps)*/
tmp=8;
speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);
//inFile = argv[1];
fin = fopen(inFile, "r");
if( !fin ) return( -1 ); // couldn't find file
fread(header, sizeof(char), 10000, fin); // get wav header
fout = fopen(tempFile, "w");
/*Initialization of the structure that holds the bits*/
speex_bits_init(&bits);
while (1)
{
/*Read a 16 bits/sample audio frame*/
fread(in, sizeof(short), FRAME_SIZE, fin);
if (feof(fin)) break;
/*Copy the 16 bits values to float so Speex can work on them*/
for (i=0;i<FRAME_SIZE;i++)
input[i]=in[i];
/*Flush all the bits in the struct so we can encode a new frame*/
speex_bits_reset(&bits);
/*Encode the frame*/
speex_encode(state, input, &bits);
/*Copy the bits to an array of char that can be written*/
nbBytes = speex_bits_write(&bits, cbits, 200);
/*Write the size of the frame first. This is what sampledec expects
but
it's likely to be different in your own application*/
fwrite(&nbBytes, sizeof(int), 1, fout);
/*Write the compressed data*/
fwrite(cbits, 1, nbBytes, fout);
}
/*Destroy the encoder state*/
speex_encoder_destroy(state);
/*Destroy the bit-packing struct*/
speex_bits_destroy(&bits);
fclose(fin);
fclose(fout);
//////////////////// decoder ////////////////////
/*Create a new decoder state in narrowband mode*/
state = speex_decoder_init(&speex_nb_mode);
/*Set the perceptual enhancement on*/
tmp=1;
speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp);
//outFile = argv[1];
fin = fopen(tempFile, "r");
fout = fopen(outFile, "w");
fwrite(header, sizeof(char), 10000, fout);
/*Initialization of the structure that holds the bits*/
speex_bits_init(&bits);
while (1)
{
/*Read the size encoded by sampleenc, this part will likely be
different in your application*/
fread(&nbBytes, sizeof(int), 1, fin);
fprintf (stderr, "nbBytes: %d\n", nbBytes);
if (feof(fin))
break;
/*Read the "packet" encoded by sampleenc*/
fread(cbits, 1, nbBytes, fin);
/*Copy the data into the bit-stream struct*/
speex_bits_read_from(&bits, cbits, nbBytes);
/*Decode the data*/
speex_decode(state, &bits, output);
/*Copy from float to short (16 bits) for output*/
for (i=0;i<FRAME_SIZE;i++)
out[i]=output[i];
/*Write the decoded audio to file*/
fwrite(out, sizeof(short), FRAME_SIZE, fout);
}
/*Destroy the decoder state*/
speex_decoder_destroy(state);
/*Destroy the bit-stream truct*/
speex_bits_destroy(&bits);
fclose(fin);
fclose(fout);
}
More information about the Speex-dev
mailing list