4

我有一个 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,但仍然遇到同样的问题。

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

4

1 回答 1

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 以保持相同的音量。

于 2012-07-29T22:46:02.520 回答