从多个WAV文件中删除标头,然后将剩余数据连接到一个RAW文件中

我有一个RAW音频文件,它由几个连接的,较小的WAV文件组成。 我可以在Sound Forge中以48,000,8位PCM,签名,单声道打开并播放此文件。

我想在C#中做的是用编程方式用相同或更小长度的新数据覆盖文件中的每个WAV,我认为我非常接近能够做到。 我可以在RAW文件上执行File.ReadAllBytes,循环遍历字节数组,并确定每个WAV的开始和结束位置。 然后我在我的电脑上选择新的WAV文件,删除标题,并将剩余的数据写入我的RAW文件。 如果新的WAV小于它的目的地,我用0填充差值。

然而,当我在上面提到的设置中打开Sound Forge中的新文件时,我的所有WAV看起来更像是固体块,而不是普通的“圣诞树”形状,它们都播放得很响亮而且扭曲。 在第一次遇到这个之后,我突然意识到我的所有新的源WAV都是41,000,16位PCM,有符号立体声格式。 我以这种格式打开了我新创建的RAW文件,它外观和播放都很好。

我想我必须将所有新的WAV转换为48,000,8位PCM,签名,单声道,然后运行应用程序将它们复制到RAW文件中。 我在使用NAudio编写了一些代码,在将数据复制到我的RAW文件之前对文件进行转换,但我仍然遇到了同样的问题。 我也尝试先在Sound Forge中手动转换每个新的WAV,但仍然遇到同样的问题。

我在这里想念的是什么? 谢谢。

此代码执行您描述的内容(没有填充)。 它打开mainFile然后在指定位置插入另一个文件。 如果两个文件具有相同的格式,它将正常工作。

public void InsertWave(string mainFile, string insertFile, long position) { byte[] data = File.ReadAllBytes(insertFile); using (FileStream main = File.OpenWrite(mainFile)) { main.Seek(position, SeekOrigin.Begin); main.Write(data, 0, data.Length); main.Close(); } } 

如果两个文件都是48,000 Hz,8位PCM,签名,单声道,你就不会做错任何事。 但是,如果一个文件是单声道而另一个是立体声,或者如果一个是8位而另一个是16位,则输出将失真。

甚至文件实际使用的格式也没有关系。 只要两者具有相同的格式并且您的位置是样本大小的倍数,您将始终以有效的波形文件结束。

因此,如果输出失真,则文件很可能具有不同的格式。 如果您将立体声转换为单声道,您还必须意识到您不能只混合两个声道。 您必须将电平降低6dB才能保持相同的音量。