如何在C#中对两个音频文件进行分层?

如何在C#中对两个音频文件进行分层?,c#,audio,mp3,C#,Audio,Mp3,我需要混合两个音频文件。音频1将是一个静态文件,用于“标记”音频2。我说的是音频标签,不是ID3标签 有两个基本的问题我无法理解 1) 如何在与音频2混合时重复音频1,以使结果与音频2的长度相同 2) 音频2将是一个MP3,我不想重新编码,可能会降低它的质量 任何关于如何用C#实现这一点的库或想法都将不胜感激。您必须将mp3解码为wave格式,执行混音,然后将其编码回mp3格式 有人会告诉你一些mp3库。不过,我可以帮你进行实际的混合 这真是太酷了。声音文件只是以一定间隔记录的一组振幅样本。例如

我需要混合两个音频文件。音频1将是一个静态文件,用于“标记”音频2。我说的是音频标签,不是ID3标签

有两个基本的问题我无法理解

1) 如何在与音频2混合时重复音频1,以使结果与音频2的长度相同

2) 音频2将是一个MP3,我不想重新编码,可能会降低它的质量


任何关于如何用C#实现这一点的库或想法都将不胜感激。

您必须将mp3解码为wave格式,执行混音,然后将其编码回mp3格式

有人会告诉你一些mp3库。不过,我可以帮你进行实际的混合

这真是太酷了。声音文件只是以一定间隔记录的一组振幅样本。例如,这可能是一种声音:

0,12,128,14,-1,-13,-128,-64,-32

好的,这是一个很短的声音,但是请跟我来。假设我想将上述声音与此声音混合:

10,-12,-100,-150,-75,-25,-12,-0

这是最酷的部分,我们只需将两个阵列添加在一起:

10,0,28,-136,-76

0+10=10 12 + -12 = 0 128 + -100 = 28

你唯一需要注意的是,你可以存储在波形文件中的振幅是有限制的。现在大多数是16位的,但是你仍然可以制作8位的wave文件。如果你的振幅超过了波形文件的限制,你将不得不尽可能地高或低,并将其封顶

不管怎么说,这就是问题的症结所在。需要计算出更精细的点。

您可以使用。使用WaveFileReader类生成可以读取每个文件的波流(MP3文件需要先转换为PCM-请参阅NAudio演示代码中Mp3FileReader的使用)。然后我将生成一个循环的派生波流(即,在Read方法中,当您到达源数据的末尾时,返回到开头)


然后使用WaveMixerStream32将它们混合在一起。(首先需要将它们转换为32位-使用WaveChannel32进行转换)。此类还允许您设置每个文件的卷级别。最后,使用Wave32to16流将其转换回16位,然后使用WaveFileWriter生成最终文件。然后使用LAME转换成MP3。

我建议使用BASS库。它可以进行“混音”,也可以播放多种格式,还可以播放EQ/Fade/Compressor等DSP

在对不同位深度的音频文件进行分层时应考虑的其他事项。如果尝试将8位文件与16位文件混合,则16位文件的精度更高。在添加之前,您需要放大8位文件或缩小16位文件。这提醒了我。混音的另一个要素是音量。每次混合时,基本上就是在增加音量。如果你的音量几乎达到最大值(音乐经常是这样),你必须循环原始样本以找到最高/最低峰值,然后将混合音频标准化为该峰值。这意味着您可能希望使用范围更大的中间数据类型(如32位整数),这样当您混合两个非常响亮的(?)声音样本时,就不会截断很多峰值。在标准化之后,您可以将声音存储回16/8位格式。WaveChannel32在我尝试使用时给出了以下错误:“偏移量和长度超出了数组的界限或计数大于从索引到源集合结尾的元素数”。你知道为什么吗?(更多信息)嗨,你能用例子解释一下吗?我是Naudio的新手,谢谢