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 字节

使用 NAudio 转换为 WAV 后使用 SoundPlayer 播放 MP3

使用 NAudio 如何将非隔行扫描 32 位浮点格式保存到文件

NAudio 拆分 wav 文件问题。其他所有音频文件声音失真,而其他音频文件清晰

NAudio - wav 的流式字节 [] 使其播放缓慢

NAudio - 读取和写入 Wav 文件