我需要混合两个音频文件。音频 1 将是一个静态文件,用于“标记”音频 2。为了清楚起见,我说的是音频标签而不是 ID3 标签。
有两个基本问题我无法解决。
1) 如何在与音频 2 混合时重复音频 1,以使结果与音频 2 的长度相同?
2) 音频 2 将是 MP3,我不想重新编码它并可能降低它的质量。
任何关于如何在 C# 中完成此操作的库或想法将不胜感激。
您可以使用NAudio来执行此操作。使用 WaveFileReader 类创建一个可以读取每个文件的 WaveStream(MP3 文件需要先转换为 PCM - 请参阅 NAudio 演示代码中 Mp3FileReader 的使用)。然后我会创建一个循环的派生 WaveStream(即在 Read 方法中,当你到达源数据的末尾时,回到开头)。
然后使用 WaveMixerStream32 将它们混合在一起。(它们需要先转换为 32 位 - 使用 WaveChannel32 来执行此操作)。此类还允许您设置每个文件的音量级别。最后,使用 Wave32To16Stream 转换回 16 位,然后使用 WaveFileWriter 制作最终文件。然后使用 LAME 转换为 MP3。
您将不得不将 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 位的波形文件。如果您的幅度超过了波形文件的限制,您将不得不尽可能高或尽可能低并限制它。
无论如何,这就是它的要点。更精细的点,将需要解决。
我建议使用 BASS 库。它可以“混合”并允许播放多种格式以及 DSP,例如 EQ/Fade/Compressor。http://un4seen.com/bass.html