如何播放音频样本而不将其写入文件?

问题描述

我从另一种方法获取音频样本(作为浮点数组) 我想在不向磁盘写入任何文件的情况下播放这个浮点数组。

对于这个例子,我从音频文件获取样本:

var file = new AudioFileReader(stereoFile);

int startPos = 0;
int endPos = 138890;

var sampleArray = new float[endPos - startPos];

file.Read(sampleArray,startPos,sampleArray.Length);

我如何玩sampleArray

解决方法

我找到了下一个解决方案,它对我有用:

        var file = new AudioFileReader(stereoFile);

        WaveFormat waveFormat = file.WaveFormat;

        int startPos = 2403;
        int endPos = 41265;

        if (startPos % 2 != 0)
        {
            startPos += 1;
        }

        if (endPos % 2 != 0)
        {
            endPos += 1;
        }

        if (waveFormat.Channels == 2)
        {
            startPos *= 2;
            endPos *= 2;
        }

        var allSamples = new float[file.Length / (file.WaveFormat.BitsPerSample / 8)];

        file.Read(allSamples,allSamples.Length);

        Span<float> samplesSpan = allSamples;
        Span<float> trackSpan = samplesSpan.Slice(startPos,endPos - startPos);

^ 上层代码以获取正确的样本进行测试。 下面的代码 - 我的解决方案

        MemoryStream ms = new MemoryStream();
        IgnoreDisposeStream ids = new IgnoreDisposeStream(ms);

        using (WaveFileWriter waveFileWriter = new WaveFileWriter(ids,waveFormat))
        {
            waveFileWriter.WriteSamples(trackSpan.ToArray(),endPos-startPos);
        }


        ms.Position = 0;
        WaveStream waveStream = new WaveFileReader(ms);
        WaveOutEvent waveOutEvent = new WaveOutEvent();
        waveOutEvent.Init(waveStream);
        waveOutEvent.Play();
,

RawSourceWaveStream 专为您在字节数组或 MemoryStream 中有音频并希望直接播放的情况而设计。您可以详细了解它并查看如何使用它的示例here