C++ 如何在C++;?

C++ 如何在C++;?,c++,audio,wav,binary-data,C++,Audio,Wav,Binary Data,我已经寻找这个问题的答案好几个小时了。我已经删除了44字节的头,并使用ofstream传输了数据。输入立体声WAV文件为16位PCM,采样率为44.1k Hz int szm; char* buff = new char[szm]; ifstream ssn(f_infile,ios::binary); ssn.seekg(0,ssn.end); szm = ssn.tellg(); ssn.seekg(0,ssn.beg); ssn.r

我已经寻找这个问题的答案好几个小时了。我已经删除了44字节的头,并使用ofstream传输了数据。输入立体声WAV文件为16位PCM,采样率为44.1k Hz

    int szm;
    char* buff = new char[szm];
    ifstream ssn(f_infile,ios::binary);

    ssn.seekg(0,ssn.end);
    szm = ssn.tellg();
    ssn.seekg(0,ssn.beg);
    ssn.read(buff,szm);
    ssn.close();

    ofstream sso(f_outfile,ios::binary);

    for(int i =0; i < szm; i++)
    {
            if(i > 44)
            {
                    word_w(file, buff[i],1);
                    word_w(file, 0-(buff[i]), 1);
            }
    }

    sso.close();
    file.close();
intszm;
char*buff=新字符[szm];
ifstream-ssn(f_-infle,ios::binary);
ssn.seekg(0,ssn.end);
szm=ssn.tellg();
ssn.seekg(0,ssn.beg);
ssn.read(buff,szm);
ssn.close();
流sso(f_输出文件,ios::二进制文件);
对于(int i=0;i44)
{
word_w(文件,buff[i],1);
字w(文件,0-(buff[i]),1);
}
}
sso.close();
file.close();
我得到了文件的大小,并将数据读入缓冲区。我知道所有的原始数据文件都是二进制数据,我认为这个简单的技术可以工作。然而,我得到的结果好坏参半

第一个很有魅力。这是我想要转换的原始样本。这是原始WAV文件[top]和以44.1k Hz导入Audacity的原始数据[bottom]的并排比较

下一个由于某种原因扭曲了正确的通道,并将文件长度增加了一倍。它也是一个立体声文件,16位PCM,44.1k Hz采样率。

第三个完全扭曲,长度比前一个还要长


为什么它在第一个文件上工作,而在其他文件都是完全相同的文件格式(16位,44.1k Hz采样率,2个通道)时不工作?

在创建缓冲区之前,您必须获得文件的大小。目前,您正在使用尚未初始化的变量
szm
创建一个数组,这意味着它包含一些垃圾。那么,我看到一些
文件
变量和
word_w
函数未在提供的代码中声明。可能值得检查其中的一些头字段,以确保您确实具有正确的位数,可能还有样本数据的结尾等。您的图像表明样本被解释为
32位浮点
。是的,当我假设它们是小端时,原来它们是大端。哦,而且Audacity将它们标记为32位浮点,无论选择什么。不知道为什么。在创建缓冲区之前,您必须获得文件的大小。目前,您正在使用尚未初始化的变量
szm
创建一个数组,这意味着它包含一些垃圾。那么,我看到一些
文件
变量和
word_w
函数未在提供的代码中声明。可能值得检查其中的一些头字段,以确保您确实具有正确的位数,可能还有样本数据的结尾等。您的图像表明样本被解释为
32位浮点
。是的,当我假设它们是小端时,原来它们是大端。哦,而且Audacity将它们标记为32位浮点,无论选择什么。不知道为什么。