Как я могу повторно сэмплировать волновой файл и создать вместо файла поток или байтовый массив? - PullRequest
0 голосов
/ 02 июля 2018

Я видел много примеров повторной выборки файла и создания нового файла.

int outRate = 16000;
var inFile = @"test.wav"; // 8khz file
var outFile = @"test resampled.wav";
using (var reader = new WaveFileReader(inFile))
{
    var outFormat = new WaveFormat(outRate, reader.WaveFormat.Channels);
    using (var resampler = new MediaFoundationResampler(reader, outFormat))
    {
        WaveFileWriter.CreateWaveFile(outFile, resampler);
    }
}

Что я хочу сделать, это создать повторно сэмплированный поток или байтовый массив. Я попытался вызвать WaveFileWriter.WriteWavFileToStream (memoryStream, resampler) вместо CreateWaveFile, но я в конечном итоге с потоком, который содержит заголовок RIFF, и я не уверен, что делать в этой точке.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Спасибо за помощь. Я сейчас использую метод чтения, как предложено, но я получаю звук щелчка с повторно сэмплированным звуком. В приведенном ниже коде, когда я настраиваю размер байта [] «arr» выше 128, звук ухудшается. Что-то в способе, которым я делаю повторную выборку, вызывает щелчок.

public void AddSample(byte[] sample)
    {
        using (var sourceProvider = new RawSourceWaveStream(sample, 0, sample.Length, waveFormat))
        // Setup resampler
        using (var resampler = new MediaFoundationResampler(sourceProvider, defSampleRate))
        {
            resampler.ResamplerQuality = 60;
            var arr = new byte[128];
            while (resampler.Read(arr, 0, arr.Length) > 0)
            {
                // Send stream to the provider
                bufferedProvider.AddSamples(arr, 0, arr.Length);
            }
        }
    }
0 голосов
/ 19 сентября 2018

Вы можете просто вызвать Read на ресемплере, чтобы считать буферы, пересчитанные байты. Я обычно рекомендую читать около 1 секунды звука за раз, и продолжайте, пока Read не вернет 0

...