Naudio wav格式问题

问题描述 投票:0回答:1

我想在具有以下格式的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通道的最佳缓冲区大小。您应该如何计算样本大小,以便我可以自动知道哪种大小适用于任何给定格式?

c# wpf wav naudio
1个回答
0
投票

您可以将其重新采样到所需的频率。多产的马克·希思有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,并根据需要添加到缓冲区或输出中。

© www.soinside.com 2019 - 2024. All rights reserved.