NAudio播放声音很简单,但如果想边播放声音一边绘制波形图要怎么弄呢?
实现思路是获取当前播放声音数据,但NAudio没有提供这方面的事件处理。
分析一下NAudio的播放实现,每隔一定时间会调用 Read读取数据送入音频输出。
所以我们可以继承一个ISampleProvider,然后将数据回调处理。
示例:
//AudioFileReader是官方提供的读取音频类
public class NAudioFileReader : AudioFileReader
{
public EventHandler<int> OnWaveHandler;
public NAudioFileReader(string fileName) : base(fileName)
{
}
public override int Read(byte[] buffer, int offset, int count)
{
int samples = base.Read(buffer, offset, count);
long val = 0;
if(samples>0)
{
//audiofilereader加载的数据是32位的
//下面此断为计算平均能量
for (int i = 0; i < samples; i +=4)
{
val += Math.Abs((int)(BitConverter.ToInt32(buffer, offset + i)));
}
val = val / samples*4;
}
OnWaveHandler?.Invoke(null, val);
return samples;
}
}
public class Test
{
private NAudioFileReader _audioFileReader ;
public void TestAudioFile()
{
_audioFileReader = new NAudioFileReader(FilePath);
float boundary = 0.2f;
_audioFileReader.OnWaveHandler += (sender, val)=>{
//to do something, for example, draw waveform
};
//播放声音
m_waveOut = new WaveOut();
m_waveOut.Init(_audioFileReader);
m_waveOut.Play();
}
}