如何在C#中叠加两个音频文件?

时间:2009-05-18 20:12:20

标签: c# audio mp3

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

我无法解决两个基本问题。

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

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

任何有关如何在C#中完成此操作的图书馆或想法都将非常感激。

3 个答案:

答案 0 :(得分:4)

您可以使用NAudio执行此操作。使用WaveFileReader类创建一个可以从每个文件中读取的WaveStream(首先需要将MP3转换为PCM - 请参阅NAudio演示代码中使用Mp3FileReader)。然后我会创建一个循环的派生WaveStream(即在Read方法中,当你到达源数据的末尾时,回到开头)。

然后使用WaveMixerStream32将它们混合在一起。 (它们需要先转换为32位 - 使用WaveChannel32来完成此操作)。此类还允许您设置每个文件的音量级别。最后,使用Wave32To16Stream将其转换回16位,然后使用WaveFileWriter制作最终文件。然后使用LAME转换为MP3。

答案 1 :(得分:2)

您将不得不将mp3解码为波形格式,执行混音,然后将其编码回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位波形文件。如果你的振幅超过波形文件的极限,你必须尽可能地高或低,并将其限制。

无论如何,这是它的主旨。需要解决更细微的问题。

答案 2 :(得分:0)

我会建议BASS图书馆。它可以“混音”,也可以播放多种格式,也可以播放EQ / Fade / Compressor等DSP。 http://un4seen.com/bass.html