Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 更改wav文件的samplerate和byterate而不会在打开文件时遇到问题?_C_Audio_Wav_Alter_Tweak - Fatal编程技术网

C 更改wav文件的samplerate和byterate而不会在打开文件时遇到问题?

C 更改wav文件的samplerate和byterate而不会在打开文件时遇到问题?,c,audio,wav,alter,tweak,C,Audio,Wav,Alter,Tweak,我试图将一个503196字节的wav文件的内容写入另一个文件,并将samplerate/byterate加倍,以使速度加倍。但是,我在从输入文件读取数据并将其写入输出文件时遇到问题。这是我的密码: #include <stdio.h> int main() { struct WAVE { char ChunkID[4]; unsigned int ChunkSize; char Format[4];

我试图将一个503196字节的wav文件的内容写入另一个文件,并将samplerate/byterate加倍,以使速度加倍。但是,我在从输入文件读取数据并将其写入输出文件时遇到问题。这是我的密码:

#include <stdio.h>

int main() {
    struct WAVE {
           char ChunkID[4];
           unsigned int ChunkSize;
           char Format[4];
           char Subchunk1ID[4];
           unsigned int Subchunk1Size;
           unsigned short int AudioFormat;
           unsigned short int NumChannels;
           unsigned int SampleRate;
           unsigned int ByteRate;
           unsigned short int BlockAlign;
           unsigned short int BitsPerSample;
           char Subchunk2ID[4];
           unsigned int Subchunk2Size;
    } wav;
    FILE *original, *fast;
    original = fopen("Alejandro_project.wav", "rb");
    fast = fopen("Alejandro_fast.wav", "wb");
    if (original == NULL) {
                 printf("File does not exist.\n");
                 return 0;
    }
    fread(&wav, 1, 44, original);
    unsigned short int data[12 * wav.SampleRate]
    int i;
    for (i = 0; i < Subchunk2Size / 2; i++)
        fread(&data[i], 1, 2, original);
    fwrite(&wav, 1, 44, fast);
    unsigned int fastSampleRate = wav.SampleRate * 2;
    unsigned int fastByteRate = 2 * fastSampleRate;
    fseek(fast, 24, SEEK_SET);
    fwrite(&fastSampleRate, 4, 1, fast);
    fseek(fast, 28, SEEK_SET);
    fwrite(&fastByteRate, 4, 1, fast);
    fwrite(data, 1, 2, original);
    fclose(fast);
    fclose(original);
}
#包括
int main(){
结构波{
char ChunkID[4];
无符号整数块大小;
字符格式[4];
char Subchunk1ID[4];
无符号整数分块大小;
无符号短整数音频格式;
无符号短整数通道;
无符号整数采样器;
无符号整数字节;
无符号短整型块对齐;
无符号短整数位样本;
char Subchunk2ID[4];
无符号整数分块大小;
}wav;
文件*原件,*快速;
原件=fopen(“Alejandro_project.wav”、“rb”);
fast=fopen(“Alejandro_fast.wav”、“wb”);
如果(原始==NULL){
printf(“文件不存在。\n”);
返回0;
}
fread(和wav,1,44,原件);
无符号短整数数据[12*wav.SampleRate]
int i;
对于(i=0;i
有几个问题。。对于初学者,您需要确保WAVE标头的结构已打包,这样结构中就不会出现意外的填充,从而使某些字段错位并增加结构的大小。否则,在每个
unsigned short int
成员之后可能会有两个字节的额外填充

#pragma pack(push,1) /* for VC, may also work for GCC */
struct WAVE {
     /* ...struct contents... */
} wav;
#pragma pack(pop)
其次,看起来您只是试图覆盖新文件中的SampleRate和ByteRate成员,而其余成员保持不变。仅当新文件已经是旧文件的副本时,此操作才有效。如果是这样,您还需要将打开新文件的模式改为“r+b”(读模式+写模式),而不是“wb”(写模式),这样现有的文件内容就不会被丢弃

尝试写入标头时也会出现错误。这一行:

fread(original, 1, 44, fast);
应该是:

fwrite(&wav, 44, 1, fast);
wav
向新文件写入44个字节,而不是从新文件读取并使用旧文件的
文件*
作为目标


如果新文件不是旧文件的副本,则还需要复制文件的其余部分(包括头的其他部分)。在这种情况下,可能最容易(打开文件后):

  • 将旧文件的标题读入
    wav

    fread(&wav, sizeof(wav), 1, original);
    
  • 修改
    SampleRate
    ByteRate
    字段

    wav.SampleRate *= 2;
    wav.ByteRate *= 2;
    
  • 将整个修改的
    wav
    头写入新文件

    fwrite(&wav, sizeof(wav), 1, fast);
    
  • 以循环方式将旧文件的其余部分复制到新文件

    char buf[1024];
    int count;
    while ((count = fread(buf, 1, sizeof(buf), original)) > 0)
        fwrite(buf, 1, count, fast);
    

  • …然后关闭文件并返回。

    我找到了答案。我删除了结构只是为了看看我在做什么。一旦我完成了最后一个项目,我就要把这个结构合并回去

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
        FILE *original, *fast, *slow, *slowdown;
        unsigned int ChunkSize, Subchunk1Size, Subchunk2Size, RIFFSize, fmtSize, dataSize, SampleRate, ByteRate;
        unsigned short int AudioFormat, NumChannels, BlockAlign, BitsPerSample;
        char ChunkID[5], Format[5], Subchunk1ID[5], Subchunk2ID[5];
        ChunkID[4] = '\0';
        Format[4] = '\0';
        Subchunk1ID[4] = '\0';
        Subchunk2ID[4] = '\0';
        char path[FILENAME_MAX], dfast[FILENAME_MAX], dslow[FILENAME_MAX], dslowdown[FILENAME_MAX];
        printf("Enter path to Alejandro_project.wav file: ");
        scanf("%s", path);
        strcpy(dfast, path);
        dfast[strlen(path) - 21] = '\0';
        strcpy(dslow, dfast);
        strcpy(dslowdown, dslow);
        strcat(dfast, "Alejandro_fast.wav");
        strcat(dslow, "Alejandro_slow.wav");
        strcat(dslowdown, "Alejandro_slowdown.wav");
        original = fopen(path, "rb");
        if (!original) {
            printf("Error: file does not exist.\n");
            return EXIT_FAILURE;
        }
        fread(ChunkID, 4, 1, original);
        fread(&ChunkSize, 4, 1, original);
        fread(Format, 4, 1, original);
        fread(Subchunk1ID, 4, 1, original);
        fread(&Subchunk1Size, 4, 1, original);
        fread(&AudioFormat, 2, 1, original);
        fread(&NumChannels, 2, 1, original);
        fread(&SampleRate, 4, 1, original);
        fread(&ByteRate, 4, 1, original);
        fread(&BlockAlign, 2, 1, original);
        fread(&BitsPerSample, 2, 1, original);
        fread(Subchunk2ID, 4, 1, original);
        fread(&Subchunk2Size, 4, 1, original);
        fmtSize = Subchunk1Size + 8;
        dataSize = Subchunk2Size + 8;
        RIFFSize = ChunkSize + 8 - (fmtSize + dataSize);
        printf("RIFF Size:     %d\n", RIFFSize);
        printf("fmt Size:      %d\n", fmtSize);
        printf("data Size:     %d\n\n", dataSize);
        printf("ChunkID:       %s\n", ChunkID);
        printf("ChunkSize:     %d\n", ChunkSize);
        printf("Format:        %s\n\n", Format);
        printf("Subchunk1ID:   %s\n", Subchunk1ID);
        printf("Subchunk1Size: %d\n", Subchunk1Size);
        printf("AudioFormat:   %d\n", AudioFormat);
        printf("NumChannels:   %d\n", NumChannels);
        printf("SampleRate:    %d\n", SampleRate);
        printf("ByteRate:      %d\n", ByteRate);
        printf("BlockAlign:    %d\n", BlockAlign);
        printf("BitsPerSample: %d\n\n", BitsPerSample);
        printf("Subchunk2ID:   %s\n", Subchunk2ID);
        printf("Subchunk2Size: %d\n", Subchunk2Size);
        fseek(original, 0, SEEK_SET);
        fast = fopen(dfast, "wb");
        unsigned int fastSampleRate = SampleRate * 2;
        unsigned int fastByteRate = 2 * fastSampleRate;
        fwrite(ChunkID, 4, 1, fast);
        fwrite(&ChunkSize, 4, 1, fast);
        fwrite(Format, 4, 1, fast);
        fwrite(Subchunk1ID, 4, 1, fast);
        fwrite(&Subchunk1Size, 4, 1, fast);
        fwrite(&AudioFormat, 2, 1, fast);
        fwrite(&NumChannels, 2, 1, fast);
        fwrite(&fastSampleRate, 4, 1, fast);
        fwrite(&fastByteRate, 4, 1, fast);
        fwrite(&BlockAlign, 2, 1, fast);
        fwrite(&BitsPerSample, 2, 1, fast);
        fwrite(Subchunk2ID, 4, 1, fast);
        fwrite(&Subchunk2Size, 4, 1, fast);
        short int data;
        unsigned int i;
        for (i = 0; i < Subchunk2Size / 2; i++) {
            fread(&data, 2, 1, original);
            fwrite(&data, 2, 1, fast);
        }
        fclose(fast);
        fseek(original, 0, SEEK_SET);
        slow = fopen(dslow, "wb");
        unsigned int slowSampleRate = SampleRate / 2;
        unsigned int slowByteRate = 2 * slowSampleRate;
        fwrite(ChunkID, 4, 1, slow);
        fwrite(&ChunkSize, 4, 1, slow);
        fwrite(Format, 4, 1, slow);
        fwrite(Subchunk1ID, 4, 1, slow);
        fwrite(&Subchunk1Size, 4, 1, slow);
        fwrite(&AudioFormat, 2, 1, slow);
        fwrite(&NumChannels, 2, 1, slow);
        fwrite(&slowSampleRate, 4, 1, slow);
        fwrite(&slowByteRate, 4, 1, slow);
        fwrite(&BlockAlign, 2, 1, slow);
        fwrite(&BitsPerSample, 2, 1, slow);
        fwrite(Subchunk2ID, 4, 1, slow);
        fwrite(&Subchunk2Size, 4, 1, slow);
        for (i = 0; i < Subchunk2Size / 2; i++) {
            fread(&data, 2, 1, original);
            fwrite(&data, 2, 1, slow);
        }
        fclose(slow);    
        fclose(original);
        system("pause");
        return EXIT_SUCCESS;
    }
    
    #包括
    #包括
    #包括
    int main(){
    文件*原始,*快,*慢,*慢;
    unsigned int ChunkSize、Subchunk1Size、Subchunk2Size、RIFFSize、fmtSize、dataSize、SampleRate、ByteRate;
    无符号短整数音频格式、数字通道、块对齐、位采样;
    char ChunkID[5],Format[5],Subchunk1ID[5],Subchunk2ID[5];
    ChunkID[4]='\0';
    格式[4]='\0';
    子chunk1id[4]='\0';
    Subchunk2ID[4]='\0';
    char path[FILENAME\u MAX]、dfast[FILENAME\u MAX]、dslow[FILENAME\u MAX]、dslowdown[FILENAME\u MAX];
    printf(“输入Alejandro_project.wav文件的路径:”);
    scanf(“%s”,路径);
    strcpy(dfast,path);
    dfast[strlen(path)-21]='\0';
    strcpy(dslow,dfast);
    strcpy(dslowdown,dslow);
    strcat(dfast,“Alejandro_fast.wav”);
    strcat(dslow,“Alejandro_slow.wav”);
    strcat(dslowdown,“Alejandro_delow.wav”);
    原始=fopen(路径,“rb”);
    如果(!原件){
    printf(“错误:文件不存在。\n”);
    返回退出失败;
    }
    fread(ChunkID,4,1,原件);
    fread(和ChunkSize,4,1,原件);
    fread(格式4,1,原件);
    fread(分包商ID,4,1,原件);
    fread(尺寸为4号和1号的分块原版);
    fread(音频格式,2,1,原件);
    fread(和NumChannels,2,1,原件);
    fread(和采样器,4,1,原件);
    fread(&ByteRate,4,1,原件);
    fread(和BlockAlign,2,1,原件);
    fread(&BitsPerSample,2,1,原件);
    fread(第4、1子块,原件);
    fread(尺寸为4号和1号的分块原版);
    fmtSize=次弹簧尺寸+8;
    数据大小=子块大小+8;
    RIFFSize=ChunkSize+8-(fmtSize+dataSize);
    printf(“RIFF大小:%d\n”,RIFFSize);
    printf(“fmt大小:%d\n”,fmt大小);
    printf(“数据大小:%d\n\n”,数据大小);
    printf(“ChunkID:%s\n”,ChunkID);
    printf(“ChunkSize:%d\n”,ChunkSize);
    printf(“格式:%s\n\n”,格式);
    printf(“子chunk1id:%s\n”,子chunk1id);
    printf(“Subchunk1Size:%d\n”,Subchunk1Size);
    printf(“音频格式:%d\n”,音频格式);
    printf(“NumChannels:%d\n”,NumChannels);
    printf(“采样器:%d\n”,采样器);
    printf(“字节:%d\n”,字节);
    printf(“块对齐:%d\n”,块对齐);
    printf(“BitsPerSample:%d\n\n”,BitsPerSample);
    printf(“Subchunk2ID:%s\n”,Subchunk2ID);
    printf(“Subchunk2Size:%d\n”,Subchunk2Size);
    fseek(原始,0,搜索集);
    fast=fopen(dfast,“wb”);
    unsigned int fastSampleRate=SampleRate*2;
    无符号整数f