NAudio - доступ и модификация отдельных образцов - PullRequest
0 голосов
/ 13 марта 2012

Я хотел бы использовать NAudio для чтения, модификации и написания волн. Есть ли прямой доступ для получения и настройки отдельных образцов волновых файлов в этой библиотеке. Например, я хотел бы открыть файл WAV, а затем я хотел бы получить значения пятых выборок на всех каналах в виде плавающих. Я также хотел бы знать, есть ли способ изменить эти 5-ые образцы, а после этого как сохранить этот измененный результат. Не могли бы вы помочь и показать мне, как это можно сделать. До сих пор я не нашел никакой документации, есть ли? Спасибо.

1 Ответ

3 голосов
/ 14 марта 2012

Да, NAudio разработан для того, чтобы предоставить вам доступ к отдельным аудиосэмплам. Однако существует множество различных аудиоформатов (битовая глубина, типы сжатия и т. Д.), Поэтому не существует единого универсального способа сделать это. Класс WaveFileReader предоставит вам доступ к необработанным байтовым данным. Затем вы можете самостоятельно преобразовать каждую пару байтов в 16-битные сэмплы или воспользоваться некоторыми из вспомогательных классов NAudio, чтобы вам было проще работать непосредственно с 16-битным аудио (при условии, что ваше аудио 16-битное). Затем вы используете класс WaveFileWriter для записи измененного звука обратно на диск.

В качестве альтернативы, если вы хотите работать со звуком как с плавающей точкой, вы можете использовать новый класс AudioFileReader, реализующий ISampleProvider, который позволяет очень просто исследовать значение каждого сэмпла в виде числа с плавающей точкой, поскольку оно поступает через метод Read , Вы должны создать свой собственный ISampleProvider, чей метод чтения читает из источника AudioFileReader, проверяет и изменяет аудио:

var reader = new AudioFileReader();
var mySampleProvider = new MySampleProvider(reader);
WaveFileWriter.CreateWaveFile(mySampleProvider, "example.wav");

...
class MySampleProvider: ISampleProvider
{
    private readonly ISampleProvider source;

    public MySampleProvider(ISampleProvider source)
    {
        this.source = source;
    }

    public int Read(float[] buffer, int offset, int count)
    {
        int samplesRead = source.Read(buffer, offset, count);
        // TODO: examine and optionally change the contents of buffer
        return samplesRead;
    }

    public WaveFormat WaveFormat
    {
        get { return source.WaveFormat; }
    }
}
...