我目前正在开发一个C程序,它打开一个.wav文件,复制输出文件中的.wav头文件,并在头文件之后添加从输入文件获得的处理后的数据。该过程包括将每个样本乘以0.5,以降低信号的幅度。下面是我的代码:
program.c
#include <stdio.h>
#include <stdlib.h>
struct header_file
{
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;
char subchunk2_id[4];
int subchunk2_size;
};
struct header_file header;
int main()
{
FILE * inputfile = fopen("maneskin.wav","rb"); // deschidere fisier .wav, modul de citire
FILE * outputfile = fopen("Output.wav","wb"); // creeaza fisierul .wav, modul de scriere
int BUFFSIZE = 10000; // lungimea buffer-ului
int count = 0; // numara cate frame-uri sunt in fisier
short int inputBuffer[BUFFSIZE];
short int outputBuffer[BUFFSIZE];
/* header_p meta = (header_p)malloc(sizeof(header)); */
int nb; // numarul de bytes returnati
int temp;
if (inputfile)
{
fread(&header, sizeof(header),1, inputfile);
fwrite(&header,sizeof(header),1, outputfile);
short int ch2[BUFFSIZE];
for(int i=0; i<BUFFSIZE; i++) \
ch2[i] = 1;
while (!feof(inputfile))//cat timp se citeste fisierul
{
for(int i=0; i<BUFFSIZE && !feof(inputfile); i++)
fread((char*)&inputBuffer[i],sizeof(short int),1, inputfile); // citirea datelor
count++;// incrementarea numarului de frame-uri
for(int z=0; z<BUFFSIZE; z++){
outputBuffer[z]=0.5*inputBuffer[z];
}
for(int k=0; k<BUFFSIZE; k++)
{
fwrite((char*)&outputBuffer[k], sizeof(short int), 1, outputfile);// scriere in fisier
}
}
printf("Numarul de cadre din fisierul wav:%d\n", count);
}
return 0;
}我遇到的问题是,当我试图用VLC或任何其他媒体播放器打开输出文件时,它不能打开,并给我一个错误。我认为这可能是输出文件中的头写入的问题,但我不确定。我尝试在Audacity中将文件作为原始数据导入,并播放音频文件,但如果我尝试将其导入为wav文件,则work.What不会出现问题吗?
发布于 2021-09-06 16:03:07
我不知道这是不是你唯一的问题,但这绝对是个问题...在C语言中,通常当你定义一个结构时,该结构的成员在内存中并不是紧挨着的。编译器将它们安排在适合处理器的边界上,通常是以处理器的字长递增。因此,由两个it包围的char类型的元素并不是恰好位于它们之间,而是在它和下一个元素之间实际上有大约7字节的空间。
这样做是为了提高执行效率,而且通常是有意义的。
但在这种情况下,您希望将结构元素紧密地打包在一起,为此,有一种标准方法可以告诉编译器这就是您想要的:
/* pack in 1 byte increments */
#pragma pack(1)
struct header_file
{
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;
char subchunk2_id[4];
int subchunk2_size;
};
/* reset to default */
#pragma pack()我还建议使用特定于大小的类型,例如uint16_t而不是short int,因为您不知道在可能编译代码的每个平台上int的大小。
在您的代码中,尝试打印sizeof标头,看看它是否是您所期望的,例如:
printf("sizeof(header)=%d\n", sizeof(header));如果数字与WAV报头的应有值不匹配,则说明一个或多个元素的大小有问题,或者包装有问题。
https://stackoverflow.com/questions/69077301
复制相似问题