用NAudio读取一个wave的chunk,并在屏幕上显示出来,并加上详细注释,谢谢
时间: 2023-12-06 12:44:23 浏览: 151
首先,我们需要安装NAudio。可以通过NuGet包管理器或者在Visual Studio的“工具”菜单中选择“NuGet包管理器”来安装。
接下来,在代码中引入NAudio命名空间:
```csharp
using NAudio.Wave;
```
然后,我们需要创建一个WaveFileReader对象来读取wave文件,并使用它来读取数据块。同时,我们也需要一个BufferedWaveProvider对象来缓存数据块:
```csharp
var reader = new WaveFileReader("test.wav");
var provider = new BufferedWaveProvider(reader.WaveFormat);
```
接下来,我们需要一个循环来读取每个数据块,并将其添加到缓冲区中:
```csharp
while (reader.Position < reader.Length)
{
var buffer = new byte[reader.WaveFormat.BlockAlign];
var bytesRead = reader.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
provider.AddSamples(buffer, 0, bytesRead);
}
}
```
在读取完所有数据块后,我们可以通过provider的BufferedDuration属性来计算缓冲区中的数据长度,并使用GetSamples方法来获取所有可用的数据块:
```csharp
var bufferedSeconds = provider.BufferedDuration.TotalSeconds;
var bufferedBytes = (int)(bufferedSeconds * reader.WaveFormat.AverageBytesPerSecond);
var buffer = new byte[bufferedBytes];
var samplesRead = provider.GetSamples(buffer, 0, buffer.Length);
```
最后,我们可以将读取到的数据块绘制到屏幕上:
```csharp
for (int i = 0; i < samplesRead; i += reader.WaveFormat.BlockAlign)
{
var sample = BitConverter.ToInt16(buffer, i);
// 在此处添加显示代码
}
```
具体如何绘制数据块,可以根据需要自行实现。
完整代码如下:
```csharp
using NAudio.Wave;
var reader = new WaveFileReader("test.wav");
var provider = new BufferedWaveProvider(reader.WaveFormat);
while (reader.Position < reader.Length)
{
var buffer = new byte[reader.WaveFormat.BlockAlign];
var bytesRead = reader.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
provider.AddSamples(buffer, 0, bytesRead);
}
}
var bufferedSeconds = provider.BufferedDuration.TotalSeconds;
var bufferedBytes = (int)(bufferedSeconds * reader.WaveFormat.AverageBytesPerSecond);
var buffer = new byte[bufferedBytes];
var samplesRead = provider.GetSamples(buffer, 0, buffer.Length);
for (int i = 0; i < samplesRead; i += reader.WaveFormat.BlockAlign)
{
var sample = BitConverter.ToInt16(buffer, i);
// 在此处添加显示代码
}
```
阅读全文
相关推荐

















