如何在不将音频样本写入文件的情况下播放音频样本?
How to play audio samples without writing it into to a file?
我从另一种方法获取音频样本(作为浮点数组)
我想在不将任何文件写入磁盘的情况下播放此浮点数组。
对于这个例子,我从音频文件中获取样本:
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, 0, 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(), 0, endPos-startPos);
}
ms.Position = 0;
WaveStream waveStream = new WaveFileReader(ms);
WaveOutEvent waveOutEvent = new WaveOutEvent();
waveOutEvent.Init(waveStream);
waveOutEvent.Play();
RawSourceWaveStream
专为字节数组或 MemoryStream
中有音频并想直接播放的情况而设计。您可以了解更多信息并查看如何使用它的示例 here
我从另一种方法获取音频样本(作为浮点数组) 我想在不将任何文件写入磁盘的情况下播放此浮点数组。
对于这个例子,我从音频文件中获取样本:
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, 0, 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(), 0, endPos-startPos);
}
ms.Position = 0;
WaveStream waveStream = new WaveFileReader(ms);
WaveOutEvent waveOutEvent = new WaveOutEvent();
waveOutEvent.Init(waveStream);
waveOutEvent.Play();
RawSourceWaveStream
专为字节数组或 MemoryStream
中有音频并想直接播放的情况而设计。您可以了解更多信息并查看如何使用它的示例 here