1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| char *inFile;
FILE *fin;
FILE *out;
short in[FRAME_SIZE];
float input[FRAME_SIZE];
printf("FRAME_SIZE: %i\n", FRAME_SIZE);
char cbits[4096];
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;
/*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 = "test.mp3";
if ((fin = fopen(inFile, "r")) == NULL)
{
printf("Warning: Cannot open file!\n");
system("pause");
return 0;
}
if ((out = fopen("test.out", "w+")) == NULL)
{
printf("Warning: Cannot open file!\n");
system("pause");
return 0;
}
/*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);
int toto = 0;
while (toto < FRAME_SIZE)
{
std::cout << input[toto] << " " << in[toto] << std::endl;
toto++;
}
/*Copy the bits to an array of char that can be written*/
nbBytes = speex_bits_write(&bits, cbits, FRAME_SIZE);
/*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, out);
/*Write the compressed data*/
std::cout << nbBytes << std::endl;
fwrite(cbits, 1, nbBytes, out);
}
system("pause");
/*Destroy the encoder state*/
speex_encoder_destroy(state);
/*Destroy the bit-packing struct*/
speex_bits_destroy(&bits);
fclose(fin);
fclose(fout); |
Partager