C# Naudio wav格式问题
我想在NAudio BufferedWaveProviders上播放具有此格式的wav文件:WaveFormat.CreateIeeeFloatWaveFormat(8000,1) 我的波形文件格式为16位PCM:44kHz 2通道。 我从文件中读取字节,并将它们作为示例添加到bufferedWaveProvider。对于我想要使用的格式(应用程序中已经存在),根本没有音频。使用标准格式(new WaveFormat()),音频工作正常。是否可以操纵波形文件数据以按要求的格式播放C# Naudio wav格式问题,c#,wpf,wav,naudio,C#,Wpf,Wav,Naudio,我想在NAudio BufferedWaveProviders上播放具有此格式的wav文件:WaveFormat.CreateIeeeFloatWaveFormat(8000,1) 我的波形文件格式为16位PCM:44kHz 2通道。 我从文件中读取字节,并将它们作为示例添加到bufferedWaveProvider。对于我想要使用的格式(应用程序中已经存在),根本没有音频。使用标准格式(new WaveFormat()),音频工作正常。是否可以操纵波形文件数据以按要求的格式播放 buffere
bufferedWaveProvider = new BufferedWaveProvider(WaveFormat.CreateIeeeFloatWaveFormat(8000, 1);
player = new WaveOut();
player.DeviceNumber = -1;
player.Init(bufferedWaveProvider);
player.Play();
using (WaveFileReader reader = new WaveFileReader ("filePath")
{
int end = (int)reader.Length;
byte[] buffer = new byte[336];
while (reader.Position < end)
{
int bytesRequired = (int)(end - reader.Position);
if (bytesRequired > 0)
{
int bytesToRead = Math.Min(bytesRequired,buffered.Length);
int bytesRead = reader.Read(buffer, 0 , bytesToRead);
if (bytesRead > 0)
{
bufferedWaveProvider.AddSamples(buffer, 0, bytesRead);
}
}
}
}
bufferedWaveProvider=新的bufferedWaveProvider(WaveFormat.CreateEEFloatWaveFormat(8000,1);
player=新的WaveOut();
player.DeviceNumber=-1;
player.Init(bufferedWaveProvider);
player.Play();
使用(WaveFileReader=新的WaveFileReader(“文件路径”)
{
int end=(int)reader.Length;
字节[]缓冲区=新字节[336];
while(reader.Position0)
{
int bytesToRead=Math.Min(bytesRequired,buffered.Length);
int bytesRead=reader.Read(缓冲区,0,bytesToRead);
如果(字节读取>0)
{
AddSamples(缓冲区,0,字节读取);
}
}
}
}
我还有一个附带的问题,在我弄清楚如何流式传输wave文件数据时,我不得不试验要发送的字节缓冲区大小,因为如果它太小,音频就会断断续续,如果它太大,缓冲区就会溢出。
通过反复试验,我发现336是16位、44100采样率、2个通道的波形格式的最佳缓冲区大小。您应该如何计算样本大小,以便我能够自动知道什么大小适用于任何给定的格式?您可以将其重采样到所需的频率。多产的Mark Heath有 输出:
8000 Hz, 1 channel, IeeeFloat
您可以从重采样器中读取数据,因为它是一个
ISampleProvider
,并根据需要添加到缓冲区或输出。为什么要使用BufferedWaveProvider?为什么不直接播放WAV文件?因为它需要流式传输到多个客户端。它以任何配置跨网络将耳机分组,并广播音频e从一个耳机或一个wave文件到组中的任何耳机,所以如果一个操作员想要耳机A听到一些东西,他可以创建一个频道,包括耳机和流他想要的任何东西。这是一个拖拽,所以如果有人在一个传输过程中把一个头放到一个组中,它会在数据流的中间拾取。
8000 Hz, 1 channel, IeeeFloat