我正在编写一个C#应用程序来处理WAV文件,并且我已经完成了足够的代码来读取任何文件的块(即,以格式化元数据和所有其他块的形式读取,准备使用此信息来处理数据)。
我现在必须处理数据块,但是我没有想法/资源来学习如何将样本组合在一起。如果可能的话,您能否仅使用 数据块上的链接/信息,而不是WAV文件的总体结构来回答。
我需要更多地了解随着时间的推移如何逐字节地构造样本。
谢谢!如果我对这个问题做错了什么,请发表评论,以便重新撰写/编辑帖子。
答案 0 :(得分:0)
这当然取决于所使用的编解码器,但是我们假设使用PCM,因为这是迄今为止在WAV文件中最常见的内容。
PCM是对特定时间点的压力测量值进行编码的一种方式。如果我以足够快的速度和足够的分辨率测量压力水平,那么我就可以准确地近似原始波形。来自维基百科:https://en.wikipedia.org/wiki/Pulse-code_modulation
由于您已经在解析标头,因此知道采样率。那就是每秒采样的数量。典型的CD音频为每秒44,100个采样(或44.1 kHz采样率)。对于视频,更常用的采样率为48 kHz。
从标题开始,您还知道每个样本的位数。这表示每个采样的分辨率。 16位样本自然每个样本占用2个字节。
在音频数据中,样本只是数字值,一个接一个。
[sample 0][sample 1][sample 2][...]
通道计数也显示在标题中,它告诉您采样了多少个离散通道。单声道声音只有1个。立体声将有2个。5.1环绕声将有6个。样本值本身是交错的,一个通道采样一个接一个,一个帧。如果我有一个带有左右声道的立体声轨道,它将看起来像这样:
[L][R][L][R][L][R][L][R][...]
要实际读取这些数值,通常将数据写为低位字节序。对于16位及更高的样本,通常使用带符号的整数。