将wav文件转换为单声道
Posted
技术标签:
【中文标题】将wav文件转换为单声道【英文标题】:Converting wav file to mono 【发布时间】:2017-08-15 10:49:01 【问题描述】:我正在尝试使用 NAudio 将立体声 .wav 文件转换为单声道。一个要求是我不能使用任何本机调用,因为我需要在 Azure 上运行此代码。这是我带来的:
using (var waveFileReader = new WaveFileReader(sourceFileName))
var toMono = new StereoToMonoProvider16(waveFileReader);
WaveFileWriter.CreateWaveFile(destFileName, toMono);
我的代码可以正常工作,但输出是一个包含纯静默的文件。
还有其他方法可以将文件转换为单声道吗?
【问题讨论】:
.wav 文件是一个字节数组。所以你可以在没有任何外部库的情况下处理它。唯一的问题是如何定义转换?我的意思是,如果你有两个通道 - L,R - 你期望的输出是什么?他们的总和?平均? 是的,我知道,但我认为我不必花时间来计算 wav 文件格式并从头开始编写所有这些代码。当然,像 NAudio 这样的库应该已经有类似的东西了,不是吗?事实上,我几乎可以单独使用 mscorlib 做任何事情,但有什么意义呢? 为什么需要 mscorlib 将 wav 文件读取为字节数组,然后循环遍历音频数据并进行简单计算? 我的意思是,人们可以单独使用 mscorlib 完成所有任务,但他们仍然使用外部库来节省时间和精力。我可以使用字节和其他东西来解决我的问题,但是 NAudio 为我节省了很多时间和精力。 【参考方案1】:这段代码对我有用。
public static void StereoToMono(string sourceFile, string outputFile)
using (var waveFileReader = new WaveFileReader(sourceFile))
var outFormat = new WaveFormat(waveFileReader.WaveFormat.SampleRate, 1);
using (var resampler = new MediaFoundationResampler(waveFileReader, outFormat))
WaveFileWriter.CreateWaveFile(outputFile, resampler);
注意channels
参数是通过1
传递给outFomat
。
【讨论】:
它可以在我的 PC 上运行,但不幸的是,不能在 Azure 上运行——无法加载 DLL 'mfplat.dll'。我想知道是否可以在不使用本机 DLL 的情况下进行转换。【参考方案2】:您需要为StereoToMonoProvider16
的LeftVolume
和RightVolume
属性提供值。例如,将它们都设置为 0.5f 以混合通道,或者将左侧设置为 1.0 和右侧设置为 0.0 以丢弃右侧通道
【讨论】:
【参考方案3】:此代码对我有用,即使在 Azure 上也是如此:
private void ConvertToMono(string sourceFileName, string destFileName)
var monoFormat = new WaveFormat(44100, 1);
using (var waveFileReader = new WaveFileReader(sourceFileName))
var floatTo16Provider = new WaveFloatTo16Provider(waveFileReader);
using (var provider = new WaveFormatConversionProvider(monoFormat, floatTo16Provider))
WaveFileWriter.CreateWaveFile(destFileName, provider);
请注意,我使用了一个额外的转换器 (WaveFloatTo16Provider
),因为源是浮点格式。
【讨论】:
以上是关于将wav文件转换为单声道的主要内容,如果未能解决你的问题,请参考以下文章