Как мне выполнить повторную выборку аудиопотока в памяти (байт []) с помощью NAudio?

#c# #naudio

#c# #naudio

Вопрос:

Я хочу выполнить повторную выборку массива аудиобайтов с 8 кГц до 48 кГц. Аудиопоток получается как a byte[] из сетевого сокета.

Читая блог Марка Хита о повторной выборке с использованием NAudio, я наткнулся на следующий код

 int outRate = 16000; 
var inFile = @"test.mp3"; 
var outFile = @"test resampled WDL.wav"; 
using (var reader = new AudioFileReader(inFile)) 
{ 
    var resampler = new WdlResamplingSampleProvider(reader, outRate); 
    WaveFileWriter.CreateWaveFile16(outFile, resampler); 
}
 

Но этот код работает с файловым потоком ( AudioFileReader ), а не с данными в памяти ( byte[] ). Как я могу изменить этот код, чтобы увеличить выборку моего массива байтов?

Редактировать: по сути, я хочу увеличить выборку данных с частотой 8 кГц, полученных от однорангового сетевого узла, до 48 кГц и воспроизвести их с помощью WASAPI.

Ответ №1:

Ваш ввод в средство повторной выборки может быть a BufferedWaveProvider или a RawSourceWaveStream . Однако вы не можете использовать CreateWaveFile16 для повторной выборки в режиме реального времени. Вам нужно будет прочитать только то количество аудио, которое вы ожидаете получить, и записать его в WAV-файл.

Комментарии:

1. WdlResamplingSampleProvider принимает объект, который реализует ISampleProvider, но BufferedWaveProvider и RawSourceWaveStream оба реализуют IWaveProvider. Означает ли это, что мне нужно реализовать пользовательский BufferedWaveProvider, который реализует ISampleProvider, или есть какие-либо другие обходные пути?

2. И мне не нужно записывать в wav-файл. Скорее, я хочу воспроизвести аудиоданные с увеличенной дискретизацией с помощью WASAPI. Я думаю, что способ, которым я сформулировал вопрос, смутил вас. Следовательно, обновление вопроса

3. @Fadi есть . Вы можете использовать метод расширения ToSampleProvider. Но если вы просто хотите воспроизвести данные с увеличенной дискретизацией с помощью WASAPI, тогда просто передайте BufferedWaveProvider в WasapiOut, поскольку я поместил повторную выборку в WasapiOut.