将 2 通道以上音频转换为单声道

问题描述 投票:0回答:1

我正在使用下一个代码将立体声转换为单声道:

using (var waveFileReader = new WaveFileReader(sourceStream))
{
    var outFormat = new WaveFormat(waveFileReader.WaveFormat.SampleRate, 1);
    using (var resampler = new MediaFoundationResampler(waveFileReader, outFormat))
    {
        var stream = new MemoryStream();
        WaveFileWriter.WriteWavFileToStream(stream, resampler);

        var format = WaveFormat.CreateIeeeFloatWaveFormat(waveFileReader.WaveFormat.SampleRate, 1);
        var writer = new LameMP3FileWriter(stream, format, 32);

        writer.Flush();
        byte[] channelBytes = stream.ToArray();
        writer.Dispose();

        File.WriteAllBytes(outputFile, channelBytes);
    }
}

我想知道是否可以将 2 个以上通道(我有 8 个通道音频)音频转换为单声道音频?

更新状态: 好的,看起来我更改了代码,现在它可以将任何通道转换为单声道:

using (var waveFileReader = new WaveFileReader(sourceFile))
{
    var outFormat = new WaveFormat(44100, 1);
    using (var resampler = new MediaFoundationResampler(waveFileReader, outFormat))
    {
        var stream = new MemoryStream();
        WaveFileWriter.WriteWavFileToStream(stream, resampler);

        var format = WaveFormat.CreateIeeeFloatWaveFormat(outFormat.SampleRate, 1);
        var writer = new LameMP3FileWriter(stream, format, 32);

        writer.Flush();
        byte[] channelBytes = stream.ToArray();
        writer.Dispose();

        File.WriteAllBytes(outputFile, channelBytes);
    }
}

但现在的问题是重采样器降低了音量。我该如何修复它?我需要那个音量来保持相同的响度。

c# wav channel volume naudio
1个回答
0
投票

好吧,看来我找到了问题的答案:

using (var waveFileReader = new WaveFileReader(sourceFile))
{
    var outFormat = new WaveFormat(44100, 1);
    using (var resampler = new MediaFoundationResampler(waveFileReader, outFormat))
    {
        VolumeWaveProvider16 vol = new VolumeWaveProvider16(resampler)
        {
            Volume = 2f
        };
        var stream = new MemoryStream();
        WaveFileWriter.WriteWavFileToStream(stream, vol);

        var format = WaveFormat.CreateIeeeFloatWaveFormat(outFormat.SampleRate, 1);
        var writer = new LameMP3FileWriter(stream, format, 32);

        writer.Flush();
        byte[] channelBytes = stream.ToArray();
        writer.Dispose();

        File.WriteAllBytes(outputFile, channelBytes);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.