【发布时间】:2015-11-16 00:51:57
【问题描述】:
我正在使用 nAudio 开发点击生成器。作为测试,我创建了一个 ISampleProvidor 类来读取/播放音频文件。 iSampleProvider 读入一个 PCM(32 位 ieee)wav 文件,然后使用 WaveOut 播放器播放它。 WaveOut 仅播放通过 IsampleProvidor Read() 方法传递的音频的大约 1/4。这会导致播放不连贯。 ISampleProvider read() 方法以正确的时间间隔请求正确数量的数据,但 WaveOut 仅播放提供回接口的前 25% 的样本。知道如何解决这个问题,还是我使用了错误的类来构建点击轨道(BufferedWaveProvider 也可能有效,但它只缓冲 5 秒的音频)?
public void TestSampleProvider()
{
ISampleProvider mySamples = new MySamples();
var _waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()) {DeviceNumber = 0};
_waveOut.Init(mySamples);
_waveOut.Play();
Console.ReadLine();
}
public class MySamples : ISampleProvider
{
private float[] samplesFloats;
private int position;
private WaveFileReader clicksound;
public int Read(float[] buffer, int offset, int count)
{
var copyCount = count;
if (position + copyCount > samplesFloats.Count())
{
copyCount = samplesFloats.Count() - position;
}
Console.WriteLine("samplesFloats {0} position {1} copyCount {2} offset {3} time {4}", samplesFloats.Count(), position, copyCount, offset, DateTime.Now.Millisecond);
Buffer.BlockCopy(samplesFloats, position, buffer, offset, copyCount);
position += copyCount;
return copyCount;
}
public MySamples()
{
clicksound = new WaveFileReader(@"C:\temp\sample.wav");
WaveFormat = clicksound.WaveFormat;
samplesFloats = new float[clicksound.SampleCount];
for (int i = 0; i < clicksound.SampleCount; i++)
{
samplesFloats[i] = clicksound.ReadNextSampleFrame()[0];//it;s a mono file
}
}
public WaveFormat WaveFormat { get; private set; }
}
【问题讨论】: