如何在 .Net Core 中将两个 wave 文件合并为一个文件?
How do I merge two wave files into one in .Net Core?
我需要在 .net core 中合并两个 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);
最后我得到了一些损坏的声音而不是混合信号。我该如何解决?
合并音频流显然基本上是对每个输入音频文件中的相应样本求和。你可以研究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()
);
我需要在 .net core 中合并两个 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);
最后我得到了一些损坏的声音而不是混合信号。我该如何解决?
合并音频流显然基本上是对每个输入音频文件中的相应样本求和。你可以研究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()
);