我有一个 RAW 音频文件,它由几个串联的较小 WAV 文件组成。我可以在 Sound Forge 中以 48,000、8 位 PCM、签名、单声道格式打开并播放此文件。
我想做的是,在 C# 中,以编程方式用相等或更短长度的新数据覆盖文件中的每个单独的 WAV,我认为我已经非常接近能够做到这一点。我可以对 RAW 文件执行 File.ReadAllBytes,循环遍历字节数组,并确定每个 WAV 的开始和结束位置。然后,我在 PC 上选择新的 WAV 文件,删除标头,并将剩余数据写入 RAW 文件。如果新的 WAV 小于其目标,我会用 0 填充差异。
然而,当我按照上述设置在 Sound Forge 中打开新文件时,我的所有 WAV 看起来都更像实心块,而不是正常的“圣诞树”形状,而且它们都播放得很大声且失真。第一次体验后,我突然意识到我所有的新源 WAV 都是 41,000、16 位 PCM、带签名的立体声格式。我以这种格式打开了新创建的 RAW 文件,它看起来和播放都很好。
我想我必须首先将所有新的 WAV 转换为 48,000、8 位 PCM、签名、单声道,然后运行应用程序将它们复制到 RAW 文件中。在将数据复制到 RAW 文件之前,我使用 NAudio 编写了一些代码来对文件进行转换,但仍然遇到同样的问题。我还尝试先在 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 才能保持相同的音量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)