Как мне манипулировать усилением на wav-файле? - PullRequest
0 голосов
/ 16 января 2019

У меня есть файл WAV, и я хочу поиграть с усилением звукового клипа (увеличить в более мягких областях, уменьшить в других. И мне нужно сделать это для файлов 1k +) и сохранить его обратно на диск.

.NET, похоже, не имеет звуковой библиотеки, и ни одна из аудиобиблиотек, которые я могу найти, кажется, не имеет элементов управления для этого (Accord, Naudio, SDL2, SharpDX; хотя я просто не мог видеть то, что я находясь в поиске). Я также изучил формат WAV, чтобы попытаться сделать это непосредственно в байтовом потоке, но я не могу найти ничего более конкретного, чем блок данных, содержащий левые и правые выборки пары.

Итак, с доступом к WAV-файлу, как я могу настроить громкость для каждого сэмпла? Если возможно, мне бы также хотелось решение, которое позволило бы мне беспрепятственно работать и с другими форматами звуковых файлов.

1 Ответ

0 голосов
/ 16 января 2019

NAudio обеспечивает то, что вы ищете

ISampleProvider

Сила IWaveProvider в том, что его можно использовать для представления аудио в любом формате. Может использоваться для 16,24 или 32-битного звука PCM, и даже для сжатого аудио (MP3, G.711 и т. д.). Но если вы выполняете любой вид обработки сигнала или анализа на аудио, это очень скорее всего, вы хотите, чтобы звук был в 32-битной IEEE с плавающей запятой формат. И это может быть боль, чтобы попытаться прочитать значения с плавающей точкой из байта [] в C #.

Итак, ISampleProvider определяет интерфейс, в котором все сэмплы 32 бит с плавающей точкой

public interface ISampleProvider { 
    WaveFormat WaveFormat { get; } 
    int Read(float[] buffer, int offset, int.count); 
}

https://github.com/naudio/NAudio/blob/master/Docs/WaveProviders.md#isampleprovider

Создайте пользовательский SampleProvider, который принимает входной SampleProvider в вашем конструкторе. Используйте входной поставщик сэмплов, чтобы получить сэмплы, умножьте их на коэффициент усиления Выходная выборка = усиление х входная выборка

Используйте WaveFileWriter.CreateWaveFile, передавая customSampleProvider.ToWaveProvider () к соответствующему аргументу, для вывода обратно в файл wav.

...