如何在.Net Core中将两个wav文件合并为一个?

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

我需要在.net核心中合并两个wave文件。所以我选择OpenTK作为OpenAL的包装器。

我尝试合并两个波形文件,每个样本和采样率具有相同的比特。

1)要做到这一点,我得到这个example

2)制作2字节区域:

var sound_data1 = LoadWave(path1, FileMode.Open), out channels, out bits_per_sample, out sample_rate);

var sound_data2 = LoadWave(path2, FileMode.Open), out channels, out bits_per_sample, out sample_rate);

3)为每个字节求和并将其除以2

for (int i = 0; i < sound_data1; i++)
{
result_sound_data[i] = (byte)((sound_data1[i] + sound_data2[i]) / 2);
}

4)然后:

AL.BufferData(buffer, GetSoundFormat(channels, bits_per_sample), result_sound_data, result_sound_data.Length, sample_rate);

AL.Source(source, ALSourcei.Buffer, buffer);
AL.SourcePlay(source);

最后我得到了一些损坏的声音而不是混合信号。我该如何解决?

c# .net-core opentk openal wave
1个回答
1
投票

合并音频流显然基本上是在每个输入音频文件中采用相应样本的总和。您可以研究this sample on codeproject的源代码。这段代码可能不是最干净的,但似乎完成了工作(我测试过)。

除了处理WAV文件头之外,这里描述了输入文件数组的实际合并逻辑:

// 8. Do the merging..
// The basic algorithm for doing the merging is as follows:
// while there is at least 1 sample remaining in any of the source files
//    sample = 0
//    for each source file
//       if the source file has any samples remaining
//          sample = sample + next available sample from the source file
//    sample = sample / # of source files
//    write the sample to the output file

对于8位样本,这在以下代码示例中实现:

while (SamplesRemain(scaledAudioFiles))
{
    byte sample = 0;
    for (var i = 0; i < scaledAudioFiles.GetLength(0); ++i)
    {
        if (scaledAudioFiles[i].NumSamplesRemaining > 0)
        {
            sample += scaledAudioFiles[i].GetNextSample_8bit();
        }
    }
    sample /= (byte)(scaledAudioFiles.GetLength(0));
    outputFile.AddSample_8bit(sample);
}

该示例中的代码与.Net Core完全兼容。

如果您只想获取该代码并合并一些.wav文件,那么这里是如何做到的(仍然使用相关示例):

    private static void Main(string[] args) => WAVFile.MergeAudioFiles(
            new[] { "file1.wav", "file2.wav", "file3.wav" },
            "result.wav",
            Path.GetTempPath()
        );
© www.soinside.com 2019 - 2024. All rights reserved.