我在写一个我本来想要复制的WAV文件时遇到了麻烦。有一个函数可以接收并读取WAV文件,成功打印出所有标题信息并存储数据块,然后将其传递到写入函数以将信息写入新的WAV文件。但是当我去听复制的文件时,它基本上是2秒钟的白噪声,然后什么都没有,而原始文件包含13秒的语音。
这是写函数:
int write_pcm_wavefile(pcm_wavefile_header_type *header, char *data, char *filename)
{
FILE *my_File;
char str[100];
char *file_output_location = "copy/";
int hold = header->Subchunk2Size;
strcpy(str, file_output_location);
strcat(str, filename);
my_File = fopen(str, "wb");
fwrite(header, 1, 44, my_File);
fwrite(data, 1, hold, my_File);
fclose(my_File);
printf("\n");
return 0;
}
这是读取功能:
int read_pcm_wavefile(pcm_wavefile_header_type *header, char **data, char *filename)
{
unsigned char buffer4[4];
unsigned char buffer2[2];
unsigned char badCheck = 1;
unsigned char pcmCheck = 1;
FILE *my_File;
my_File=fopen(filename, "rb");
//ChunkID
fread(header, sizeof(header->ChunkID), 1, my_File);
if (header->ChunkID[0] != 'R' || header->ChunkID[1] != 'I' || header->ChunkID[2] != 'F' || header->ChunkID[3] != 'F')
badCheck = 0;
//Chunk Size
fread(buffer4, sizeof(buffer4), 1, my_File);
header->ChunkSize = buffer4[0] |
(buffer4[1]<<8) |
(buffer4[2]<<16) |
(buffer4[3]<<24);
//Format
fread(header->Format, sizeof(header->Format), 1, my_File);
if (header->Format[0] != 'W' || header->Format[1] != 'A' || header->Format[2] != 'V' || header->Format[3] != 'E')
badCheck = 0;
//SubChunk1ID
fread(header->Subchunk1ID, sizeof(header->Subchunk1ID), 1, my_File);
if (header->Subchunk1ID[0] != 'f' || header->Subchunk1ID[1] != 'm' || header->Subchunk1ID[2] != 't' || header->Subchunk1ID[3] != ' ')
badCheck = 0;
//SubChunk1Size
fread(buffer4, sizeof(buffer4), 1, my_File);
header->Subchunk1Size = buffer4[0] |
(buffer4[1]<<8) |
(buffer4[2]<<16) |
(buffer4[3]<<24);
//Audio Format
fread(buffer2, sizeof(buffer2), 1, my_File);
header->AudioFormat = buffer2[0] | (buffer2[1] << 8);
if (header->AudioFormat != 1)
pcmCheck = 0;
//Num Channels
fread(buffer2, sizeof(buffer2), 1, my_File);
header->NumChannels = buffer2[0] | (buffer2[1] << 8);
//Sample Rate
fread(buffer4, sizeof(buffer4), 1, my_File);
header->SampleRate = buffer4[0] |
(buffer4[1]<<8) |
(buffer4[2]<<16) |
(buffer4[3]<<24);
//Byte Rate
fread(buffer4, sizeof(buffer4), 1, my_File);
header->ByteRate = buffer4[0] |
(buffer4[1]<<8) |
(buffer4[2]<<16) |
(buffer4[3]<<24);
//Block Align
fread(buffer2, sizeof(buffer2), 1, my_File);
header->BlockAlign = buffer2[0] | (buffer2[1] << 8);
//Bits Per Sample
fread(buffer2, sizeof(buffer2), 1, my_File);
header->BitsPerSample = buffer2[0] | (buffer2[1] << 8);
if (pcmCheck == 1)
{
//SubChunk2ID
fread(header->Subchunk2ID, sizeof(header->Subchunk2ID), 1, my_File);
if (header->Subchunk2ID[0] != 'd' || header->Subchunk2ID[1] != 'a' || header->Subchunk2ID[2] != 't' || header->Subchunk2ID[3] != 'a')
badCheck = 0;
//SubChunk2Size
fread(buffer4, sizeof(buffer4), 1, my_File);
header->Subchunk2Size = buffer4[0] |
(buffer4[1]<<8) |
(buffer4[2]<<16) |
(buffer4[3]<<24);
if (header->Subchunk2Size != (header->ChunkSize - (header->Subchunk1Size + 8 + 8 + 4)))
badCheck = 0;
if (header->Subchunk2Size % 2 == 1 && header->Subchunk2Size == (header->ChunkSize - (header->Subchunk1Size + 8 + 8 + 4 + 1)))
badCheck = 1;
}
//Print
if (badCheck == 0)
{
printf("There was an issue with the file \n");
}
else
{
printf("Chunk ID = ");
for(int i = 0; i < 4; i++)
printf("%c", header->ChunkID[i]);
printf("\n");
printf("Chunk Size = %u bytes \n", (header->ChunkSize));
printf("Chunk Format = ");
for(int i = 0; i < 4; i++)
printf("%c", header->Format[i]);
printf("\n");
printf("Subchunk1ID = ");
for(int i = 0; i < 4; i++)
printf("%c", header->Subchunk1ID[i]);
printf("\n");
printf("Subchunk1 Size = %u bytes \n", (header->Subchunk1Size));
printf("Audio Format = %u (0x%04x) \n", header->AudioFormat, header->AudioFormat);
printf("Num Channels = %u \n", header->NumChannels);
printf("Sample Rate = %u \n", (header->SampleRate));
printf("Byte Rate = %u \n", (header->ByteRate));
printf("Block Align = %u \n", header->BlockAlign);
printf("Bits Per Sample = %u \n", header->BitsPerSample);
if (pcmCheck == 1)
{
printf("Subchunk2ID = ");
for(int i = 0; i < 4; i++)
printf("%c", header->Subchunk2ID[i]);
printf("\n");
printf("Subchunk2 Size = %u bytes \n", (header->Subchunk2Size));
}
char *buffer1 = (char *)malloc(header->Subchunk2Size);
if (buffer1 == 0)
{
printf("There was an issue with this file \n");
fclose(my_File);
return -1;
}
*data = buffer1;
fclose(my_File);
free(buffer1);
}
printf("\n");
return 0;
}
答案 0 :(得分:2)
这部分看起来很奇怪:
char *buffer1 = (char *)malloc(header->Subchunk2Size);
if (buffer1 == 0)
{
printf("There was an issue with this file \n");
fclose(my_File);
return -1;
}
*data = buffer1; // *data now points to the memory allocated above
fclose(my_File);
free(buffer1); // Here you free the memory - that seems strange....
首先分配一些内存并在*data
中保存指向它的指针。
但是你释放了内存,所以*data
不再指向程序所拥有的内存。
此外,您似乎从未将任何数据写入已分配的内存,这似乎很奇怪。
答案 1 :(得分:0)
想出问题是我从来没有把文件读入数据开始......这应该是我之前提到的,感谢您的帮助