我试图用c程序将我用“mplayer-ao pcm:nowaveheader”生成的pcm音频编码成mp3。我不想把mp3写进一个文件,我想保持在一个数组中,直到我需要把它写进一个文件,我写了这个,它看起来在一个短的。9秒的测试文件中工作,但它非常慢。到底怎么了?
#include <stdio.h>
#include <stdlib.h>
#include <lame/lame.h>
lame_global_flags *gfp;
int loopcount;
int inputSize;
FILE *fp=NULL;
FILE *fpo=NULL;
char *mp3buffer;
int mp3buffersize;
int countsize;
int x=0;
int y=0;
short *pcmbuffer;
short *lpcmbuffer;
short *rpcmbuffer;
int parse()
{
printf("loading PCM data...\n");
pcmbuffer=malloc(inputSize);
fread(pcmbuffer,2,(inputSize/2),fp);
printf("data in buffer\n");
printf("splitting left and right channels\n");
lpcmbuffer=malloc(inputSize/2);
countsize=((inputSize/4)-1);
while (x<=countsize)
{
lpcmbuffer[x]=pcmbuffer[x*2];
x++;
}
x=0;
rpcmbuffer=malloc(inputSize/2);
while (x<=countsize)
{
rpcmbuffer[x]=pcmbuffer[(x*2)+1];
x++;
}
x=0;
printf("starting lame\n");
gfp=lame_init();
lame_set_num_channels(gfp,2);
lame_set_in_samplerate(gfp,44100);
lame_set_brate(gfp,256);
lame_set_mode(gfp,1);
lame_set_quality(gfp,5);
if (lame_init_params(gfp)<0)
{
return 1;
}
}
encode()
{
x=0;
mp3buffersize=(1.25*countsize+7200);
mp3buffer=malloc(mp3buffersize);
while (x!=countsize)
{
lame_encode_buffer(gfp,lpcmbuffer,rpcmbuffer,x,mp3buffer,mp3buffersize);
x++;
y++;
if(y==1000)
{
printf("%d %d\n",countsize,x);
y=0;
}
}
x=0;
lame_encode_flush(gfp,mp3buffer,mp3buffersize);
fpo=fopen("test.mp3","w");
fwrite(mp3buffer,1,countsize,fpo);
}
decode()
{
}
bounty()
{
//the quicker picker upper
printf("closing files\n");
fclose(fpo);
fclose(fp);
printf("closing lame\n");
lame_close(gfp);
printf("freeing pcmbuffer\n");
free(pcmbuffer);
free(lpcmbuffer);
free(rpcmbuffer);
free(mp3buffer);
}
int main(int argc,char **argv)
{
loopcount=atoi(argv[1]);
fp=fopen(argv[2],"r");
if (fp==NULL)
{
printf("File Read Error\n");
return 0;
}
fseek(fp,0,SEEK_END);
inputSize=ftell(fp);
fseek(fp,0,SEEK_SET);
printf("detected a %d byte(s) file\n",inputSize);
printf("Proceeding with parsing and importing...\n");
if (parse()==1)
{
printf("lame init error\n");
}
printf("loopcount is %d\n",loopcount);
encode();
//the Quicker Picker Upper
bounty();
return 0;
}
最佳答案
简而言之,让这个成为你的编码函数:
void encode()
{
mp3buffersize=(1.25*countsize+7200);
mp3buffer=malloc(mp3buffersize);
lame_encode_buffer(gfp, lpcmbuffer, rpcmbuffer, countsize, mp3buffer, mp3buffersize);
lame_encode_flush(gfp,mp3buffer,mp3buffersize);
fpo=fopen("test.mp3","w");
fwrite(mp3buffer,1,countsize,fpo);
}
我从来没有使用过lame,但是,在
encode()
函数中,你一次又一次调用lame_encode_buffer()
,每次都覆盖结果,并将0
到countsize
作为每个通道的样本数(参数4)。其他评论:
为什么不使用
lame_encode_buffer_interleaved()
?大部分的parse()
函数只是撤销文件的现有交织,似乎是一种浪费。在我看来,你使用的大量全局变量都很难看。理想情况下,您的
encode()
看起来更像:encode(lame_global_flags *gfp, const short * lpcmbuffer, const short * rpcmbuffer, const int countsize)
这样,从读取参数列表可以清楚地看到变量的类型,并且它们必须来自调用方/由调用方设置。const
很高兴澄清,它们只是用来阅读的。最后,您确实应该做一些分析,例如打印输入和退出函数之间的时间差异,以确定您的时间池在哪里,并张贴您所找到的。我冒昧地猜了一下你的循环,
encode()
函数有唯一一个有肉的循环。我从来没有运行过你的程序,也许我完全错了。关于c - libmp3lame编码到char数组慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18582474/