【问题标题】:How sound data is stored .wav format?声音数据如何以.wav 格式存储?
【发布时间】:2021-11-27 12:39:44
【问题描述】:

我想用 C# 制作一个简单的 .wav 播放器用于学习目的。我想更深入地了解音频是如何在计算机上存储和播放的,所以我想手动播放 .wav,而不是简单地调用内置函数。

我查看了 .wav 文件的结构并找到了一些很棒的资源。我发现 wav 文件格式存储从第 44 个字节开始的声音数据。它包含有关先前字节中的通道和采样率的数据,但这与我的问题无关。

我发现这个数据是soundwave。据我所知,声波样本的高度代表它的频率。但是我不明白音色是从哪里来的?如果我只以正确的频率在正确的时间内播放声音,我会听到哔哔声。我可以简单地用System.Console.Beep(freq, duration); 播放它们,但你几乎不能称之为音乐。

我尝试过查看多个资源,但它们只描述了元数据,并没有涵盖声音字节流中的确切内容。我在这个网站上找到了similar question and answer,但它并没有真正回答这个问题,我相信它甚至没有被标记为接受。

波形字节流中的数据究竟是什么?如何将其变为计算机上实际播放的声音?

【问题讨论】:

    标签: c# format wav


    【解决方案1】:

    除了上面的答案之外,样本的高度就是播放时的音量。它表示扬声器被拉或向前推多远以重新产生振动。

    你所指的音色是由音频波的频率决定的。

    音频中发生了很多事情,一个简单的鼓声会产生多种频率的声音,包括谐波或不同频率的重复振动,但所有这些都不是编程网站的主题,因此您需要研究声音和频率,也许还有 DSP。

    从计算机的角度来看,您需要知道的是,声音是以设定频率采集的样本存储的,只要我们以我们希望捕获的声音频率的两倍进行采样,我们就能够重新生成原始声音。样本记录了当时音频的当前电平(音量),将样本转换回音频是声卡上的数模转换器的工作。

    操作系统通过适当的驱动程序将样本传递给硬件。在 Windows 中,WASAPI 和 ASIO 是两个 API,您可以使用它们将音频传递到声卡。查看 NAudio 等开源项目,了解调用这些操作系统 API 所需的代码。

    我希望这有助于我怀疑这个主题比你最初想象的要广泛。

    【讨论】:

      【解决方案2】:

      您误会了:样本的高度不代表频率。事实上,wav-格式根本不使用频率。 wav 基本上按照以下方式工作:

      • 以特定频率对模拟信号进行采样。 wav 的常用频率是 44,100 Hz,因此每秒将创建 44,100 个样本。
      • 每个样本都包含模拟信号在采样时间的高度。常见的wav 格式是 16 位格式。这里将使用 16 位来存储信号的高度。
      • 这一切都针对每个频道单独发生。

      我不确定数据的存储顺序,但也许您找到的一些重要资源会帮助您。

      【讨论】:

      • 那么信号的高度(即 16 位,一个样本)究竟代表什么?您如何将 16 位声音变成独特的声音?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多