Как объединить два волновых файла в один в .Net Core? - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно объединить два волновых файла в ядре .net. Поэтому я выбрал OpenTK в качестве оболочки для OpenAL.

Я попытался объединить два волновых файла с одинаковыми битами на семпл и частотой кадров.

1) Для этого я получаю пример

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);

Наконец, я получил немного поврежденного звука вместо смешанного сигнала. Как мне это решить?

1 Ответ

0 голосов
/ 05 сентября 2018

Объединение аудиопотоков, по-видимому, в основном берет сумму соответствующих выборок в каждом входном аудиофайле. Вы можете изучить исходный код этого примера на 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()
        );
...