linux c怎样将buf数据保存为.wav声音文件,使用C处理音频wav文件
我正在处理wav文件的幅度并按一些小数因子缩放它.我试图以有效记忆的方式阅读和重写文件,同时也试图解决语言的细微差别(我是C的新手).该文件可以是8位或16位格式.我想这样做的方法是首先将header data读入一些预定义的结构,然后在一个循环中处理实际数据,在那里我将一大块数据读入缓冲区,做任何需要它,以及然后将其写入输出.#include #include typedef struct he
我正在处理wav文件的幅度并按一些小数因子缩放它.我试图以有效记忆的方式阅读和重写文件,同时也试图解决语言的细微差别(我是C的新手).该文件可以是8位或16位格式.我想这样做的方法是首先将
header data读入一些预定义的结构,然后在一个循环中处理实际数据,在那里我将一大块数据读入缓冲区,做任何需要它,以及然后将其写入输出.
#include
#include
typedef struct header
{
char chunk_id[4];
int chunk_size;
char format[4];
char subchunk1_id[4];
int subchunk1_size;
short int audio_format;
short int num_channels;
int sample_rate;
int byte_rate;
short int block_align;
short int bits_per_sample;
short int extra_param_size;
char subchunk2_id[4];
int subchunk2_size;
} header;
typedef struct header* header_p;
void scale_wav_file(char * input,float factor,int is_8bit)
{
FILE * infile = fopen(input,"rb");
FILE * outfile = fopen("outfile.wav","wb");
int BUFSIZE = 4000,i,MAX_8BIT_AMP = 255,MAX_16BIT_AMP = 32678;
// used for processing 8-bit file
unsigned char inbuff8[BUFSIZE],outbuff8[BUFSIZE];
// used for processing 16-bit file
short int inbuff16[BUFSIZE],outbuff16[BUFSIZE];
// header_p points to a header struct that contains the file's Metadata fields
header_p Meta = (header_p)malloc(sizeof(header));
if (infile)
{
// read and write header data
fread(Meta,1,sizeof(header),infile);
fwrite(Meta,sizeof(Meta),outfile);
while (!feof(infile))
{
if (is_8bit)
{
fread(inbuff8,BUFSIZE,infile);
} else {
fread(inbuff16,infile);
}
// scale amplitude for 8/16 bits
for (i=0; i < BUFSIZE; ++i)
{
if (is_8bit)
{
outbuff8[i] = factor * inbuff8[i];
if ((int)outbuff8[i] > MAX_8BIT_AMP)
{
outbuff8[i] = MAX_8BIT_AMP;
}
} else {
outbuff16[i] = factor * inbuff16[i];
if ((int)outbuff16[i] > MAX_16BIT_AMP)
{
outbuff16[i] = MAX_16BIT_AMP;
} else if ((int)outbuff16[i] < -MAX_16BIT_AMP) {
outbuff16[i] = -MAX_16BIT_AMP;
}
}
}
// write to output file for 8/16 bit
if (is_8bit)
{
fwrite(outbuff8,outfile);
} else {
fwrite(outbuff16,outfile);
}
}
}
// cleanup
if (infile) { fclose(infile); }
if (outfile) { fclose(outfile); }
if (Meta) { free(Meta); }
}
int main (int argc,char const *argv[])
{
char infile[] = "file.wav";
float factor = 0.5;
scale_wav_file(infile,factor,0);
return 0;
}
我在最后得到不同的文件大小(对于40Mb文件大约1k左右),我怀疑这是因为我正在向输出写入整个缓冲区,即使文件可能已终止在填充整个缓冲区大小之前.此外,输出文件搞砸了 – 不会播放或打开 – 所以我可能做错了.关于我搞砸的地方的任何提示都会很棒.谢谢!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)