#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.