page contents

关于C#:Naudio WaveFormat格式问题

本文讲述了关于C#:Naudio WaveFormat格式问题!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2022-12-4yGQ04Hy6389592ebc656.jpg本文讲述了关于C#:Naudio WaveFormat格式问题!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

我想在具有以下格式的NAudio BufferedWaveProviders上播放wav文件:WaveFormat.CreateIeeeFloatWaveFormat(8000,1);

我的波形文件的格式是16位PCM:44kHz 2通道。
我正在从文件中读取字节,并将它们作为样本添加到bufferedWaveProvider。使用我要使用的格式(应用程序现有的格式)根本没有音频。使用标准格式(新的WaveFormat()),音频可以正常工作。是否可以操纵wave文件数据以请求的格式播放?

bufferedWaveProvider = new BufferedWaveProvider(WaveFormat.CreateIeeeFloatWaveFormat(80001);
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个通道的最佳缓冲区大小。您应该如何计算样本大小,以便我可以自动知道哪种大小适用于任何给定格式?

  • 为什么要使用BufferedWaveProvider? 为什么不直接播放WAV文件呢?
  • 因为它需要流到几个客户端。 它以任何配置在整个网络上对耳机进行分组,并从耳机或波形文件向组中的任何耳机广播音频。 因此,如果操作员希望耳机A听到一些声音,他可以创建一个通道,则包括耳机和串流任何他想要的东西。 它是拖放操作,因此如果有人在传输中间将头戴式耳机放到某个组中,它将在数据流的中间拾取。

您可以将其重新采样到所需的频率。 多产的马克·希思(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入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

  • 发表于 2022-12-02 09:48
  • 阅读 ( 593 )
  • 分类:C/C++开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
王昭君
王昭君

209 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1658 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章