将PCM转换为wav文件 #包括 #包括 int main(){ 文件*fin,*fout; 字符缓冲区[1028]; int readcount=0; 短数字通道=1; 短位样本=16; int-SamplingRate=8000; 短样本数=160; int ByteRate=NumChannels*BitsPerSample*SamplingRate/8; short BlockAlign=NumChannels*BitsPerSample/8; int DataSize=NumChannels*numOfSamples*BitsPerSample/8; int chunkSize=16; int totalSize=36+数据大小; 短音频格式=1; 如果((fout=fopen(“sample.wav”,“w”))==NULL) { printf(“打开文件时出错”); } //totooutsample=0; 写(“RIFF”,sizeof(char),4,fout); fwrite(&totalSize,sizeof(int),1,fout); 写入(“波浪”,大小(字符),4,fout); fwrite(“fmt”,sizeof(char),4,fout); fwrite(&chunkSize,sizeof(int),1,fout); fwrite(和audioFormat,sizeof(short),1,fout); fwrite(和NumChannels,sizeof(short),1,fout); fwrite(&SamplingRate,sizeof(int),1,fout); fwrite(&ByteRate,sizeof(int),1,fout); fwrite(&BlockAlign,sizeof(short),1,fout); fwrite(&BitsPerSample,sizeof(short),1,fout); 写入(“数据”,大小(字符),4,fout); fwrite(&DataSize,sizeof(int),1,fout); fclose(fout); fin=fopen(“原始样品”、“r”); fout=fopen(“样本波形”,“a”); 而(!feof(fin)) { fgets(缓冲区、缓冲区、fin); FPUT(缓冲区、fout); } 财务总监(财务); fclose(fout); }

将PCM转换为wav文件 #包括 #包括 int main(){ 文件*fin,*fout; 字符缓冲区[1028]; int readcount=0; 短数字通道=1; 短位样本=16; int-SamplingRate=8000; 短样本数=160; int ByteRate=NumChannels*BitsPerSample*SamplingRate/8; short BlockAlign=NumChannels*BitsPerSample/8; int DataSize=NumChannels*numOfSamples*BitsPerSample/8; int chunkSize=16; int totalSize=36+数据大小; 短音频格式=1; 如果((fout=fopen(“sample.wav”,“w”))==NULL) { printf(“打开文件时出错”); } //totooutsample=0; 写(“RIFF”,sizeof(char),4,fout); fwrite(&totalSize,sizeof(int),1,fout); 写入(“波浪”,大小(字符),4,fout); fwrite(“fmt”,sizeof(char),4,fout); fwrite(&chunkSize,sizeof(int),1,fout); fwrite(和audioFormat,sizeof(short),1,fout); fwrite(和NumChannels,sizeof(short),1,fout); fwrite(&SamplingRate,sizeof(int),1,fout); fwrite(&ByteRate,sizeof(int),1,fout); fwrite(&BlockAlign,sizeof(short),1,fout); fwrite(&BitsPerSample,sizeof(short),1,fout); 写入(“数据”,大小(字符),4,fout); fwrite(&DataSize,sizeof(int),1,fout); fclose(fout); fin=fopen(“原始样品”、“r”); fout=fopen(“样本波形”,“a”); 而(!feof(fin)) { fgets(缓冲区、缓冲区、fin); FPUT(缓冲区、fout); } 财务总监(财务); fclose(fout); },c,audio,C,Audio,有人能帮我解决这个代码中的问题吗。标题是正确的,甚至可以正确地写入文件。但是每当在frhed.wav文件中打开时,它都会显示一个额外的字段。而且文件也没有播放。如果我尝试使用媒体信息打开该文件,除持续时间外,其属性将按预期显示 格式:波形文件大小 :8.29 KiB持续时间:20ms总位 速率模式:恒定的总比特率 :3 394 Kbps 音频格式:PCM格式设置, Endianness:小格式设置,符号 :已签名的编解码器ID:1持续时间 :20ms比特率模式:恒定比特率 :128 Kbps通道

有人能帮我解决这个代码中的问题吗。标题是正确的,甚至可以正确地写入文件。但是每当在frhed.wav文件中打开时,它都会显示一个额外的字段。而且文件也没有播放。如果我尝试使用媒体信息打开该文件,除持续时间外,其属性将按预期显示

格式:波形文件大小
:8.29 KiB持续时间:20ms总位 速率模式:恒定的总比特率
:3 394 Kbps

音频格式:PCM格式设置, Endianness:小格式设置,符号
:已签名的编解码器ID:1持续时间
:20ms比特率模式:恒定比特率
:128 Kbps通道:1个通道 采样率:8 000 Hz位深度
:16位流大小:320字节(4%)


我对文件格式一无所知,但我发现很难相信它们后面会有一个二进制头和一个ascii数据。因此,我发现fgets和FPUT的使用有问题,因为fgets寻找\n终止符。因此,如果缓冲区在找到\n(0xa)字节之前填满,则可能会丢失数据

这样做更有意义

while(!feof(fin))
{
    fgets(buffer,sizeof(buffer),fin);
    fputs(buffer,fout);
}
size\n;
而((n=fread(buffer,1,sizeof(buffer,fin))>0){
如果(n!=fwrite(缓冲区,1,n,fout)){
perror(“fwrite”);
出口(1);
}
}
if(n<0){
佩罗(“fread”);
出口(1);
}

还有,为什么要关闭fout然后重新打开它?

是的,它起作用了。。。谢谢Charlie Burns先生。。。标题上的一些修改和你的建议使我变得更喜欢。。。我还删除了重新打开文件…:)非常感谢……)@Siri请链接到您的最终解决方案。我也需要这个。谁能帮我解释一下我应该为用于计算Subchunk2Size(Subchunk2Size==NumSamples*numChannel*BitsPerSample/8)的numofSamples提供什么输入?这里的大小是数据大小,明白了。Numofsamples与pcm文件大小相等,因为这些是示例值。因此,找到pcm文件的大小,这就是您的numsample。我使用以下代码查找pcm文件fin=fopen(“sample.raw”,“r”)的大小;如果(stat(“sample.raw”,&sb)!=0{fprintf(stderr),“%s”的“stat”失败:%s.\n,“sample.raw”,strerror(errno));退出(退出失败)}numOfSamples=sb.st\u size;
while(!feof(fin))
{
    fgets(buffer,sizeof(buffer),fin);
    fputs(buffer,fout);
}
size_t n;
while((n = fread(buffer, 1, sizeof(buffer), fin)) > 0) {
   if(n != fwrite(buffer, 1, n, fout)) {
      perror("fwrite");
      exit(1);
   }
}
if(n < 0) {
   perror("fread");
   exit(1);
}