gpt4 book ai didi

c# - 从多个 WAV 文件中删除 header ,然后将剩余数据连接到一个 RAW 文件中

转载 作者:行者123 更新时间:2023-11-30 12:49:24 28 4
gpt4 key购买 nike

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

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

然而,当我在 Sound Forge 中以上述设置打开新文件时,我所有的 WAV 看起来更像实心 block ,而不是正常的“圣诞树”形状,而且它们播放时声音很大且失真。第一次体验之后,我突然意识到我所有的新源 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 位,您的输出将会失真。

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

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

关于c# - 从多个 WAV 文件中删除 header ,然后将剩余数据连接到一个 RAW 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11711689/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com