我有一个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文件中。在将数据复制到我的RAW文件之前,我使用NAudio编写了一些代码来对文件进行转换,我仍然遇到了同样的问题。我还尝试首先在Sound Forge中手动转换每个新的WAV,但仍然遇到同样的问题。
我在这里缺少什么?感谢。
答案 0 :(得分:1)
此代码执行您描述的内容(没有填充)。它打开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才能保持相同的音量。