在C中复制和写入WAV文件

时间:2017-03-27 10:56:05

标签: c wav file-writing

我在写一个我本来想要复制的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;
}

2 个答案:

答案 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)

想出问题是我从来没有把文件读入数据开始......这应该是我之前提到的,感谢您的帮助