Naudio wav格式问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Naudio wav格式问题相关的知识,希望对你有一定的参考价值。
我想在具有以下格式的NAudio BufferedWaveProviders上播放wav文件:WaveFormat.CreateIeeeFloatWaveFormat(8000,1);
我的波形文件的格式是16位PCM:44kHz 2通道。我正在从文件中读取字节,并将它们作为样本添加到bufferedWaveProvider。使用我要使用的格式(应用程序现有的格式)根本没有音频。使用标准格式(新的WaveFormat()),音频可以正常工作。是否可以操纵wave文件数据以请求的格式播放?
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);
我还有一个附带问题。当我弄清楚如何流化wave文件数据时,我不得不尝试发送字节缓冲区的大小,因为如果字节缓冲区太小,音频会断断续续,并且如果缓冲区太大,则会溢出。通过反复试验,我发现336是16位波形格式,44100采样率,2通道的最佳缓冲区大小。您应该如何计算样本大小,以便我可以自动知道哪种大小适用于任何给定格式?
答案
您可以将其重新采样到所需的频率。多产的马克·希思有implemented a fully managed resampler。
var reader = new AudioFileReader("input.wav"); //stereo
var downmix = reader.ToMono(); //downmix to single channel
var resampler = new WdlResamplingSampleProvider(downmix, 8000); //resample to 8000 Hz
var fmt = resampler.WaveFormat;
Console.WriteLine($"fmt.SampleRate Hz, fmt.Channels channel, fmt.Encoding");
输出:
8000 Hz, 1 channel, IeeeFloat
您可以从重采样器中读取,因为它是ISampleProvider
,并根据需要添加到缓冲区或输出中。
以上是关于Naudio wav格式问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3
使用 NAudio 如何将非隔行扫描 32 位浮点格式保存到文件