本文讲述了关于C#:Naudio WaveFormat格式问题!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:
我想在具有以下格式的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个通道的最佳缓冲区大小。您应该如何计算样本大小,以便我可以自动知道哪种大小适用于任何给定格式?
您可以将其重新采样到所需的频率。 多产的马克·希思(Mark Heath)已实施了完全托管的重采样器。
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,然后根据需要将其添加到缓冲区或输出中。
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!