用WASAPI编播放器,发现系统默认的采样格式其实是浮点式的。然后我就卡壳了,查了好多资料也没完全搞懂,只是大略上知道了一点点。
我们电脑里的大部分WAV无损文件,大多是44100HZ,双声道,16位深度,即CD音质。但现在的DVD和数字电视的采样是48000HZ,蓝光甚至到了96000HZ,PCM编码也由当初的16位整数,变成了现在的32位浮点,即我们用现在的电脑录声时,采样率就是这样子,我们的硬件已经是这了。我用IAudioClient::GetMixFormat获得系统默认编码器时的格式是这样的。
wFormatTago为WAVE_FORMAT_EXTENSIBLE。
实际设备默认采样播放是WAVE_FORMAT_IEEE_FLOAT。
我一直接触的都是整型的PCM编码,浮点是真的是清楚。然后再查浮点编码,好像浮点是最接近于无损的采样方式,32位几乎对原声无损。而且浮点的分贝幅度值比16位整型(CD)要大。16位整型PCM的96DB,24位为144分贝(DVD)
我为了研究浮点,特地把16位编码的WAV文件转码成32位浮点,然后又懵逼了
wave头文件88字节,我查了一下各种wave头文件的字节数,有44,58,90的,88字节第一次遇到,特别是CKID为PEAK的CHUNK第一次遇到,谷歌了好多网站,好不容易查到点资料,然后查到这个PEAK块是用来描述峰值幅度的。
peakchunk的各字节含义:
PEAK:占4字节
PEAK SIZE(不包括PEAK和PEAK SIZE:这文件是24):占四字节
PEAK version :这个文件是1,占四字节。
PEAK 时间戳:创建的 Unix 时间戳。是自 1/1/1970 以来的秒数。 这用于查看峰值数据的日期是否与修改日期匹配 文件。 如果不是,则应重新扫描文件以获取新的峰数据。这文件是1,635,590,073秒
PEAK:每个声道都有一个 PositionPeak 结构。 这些与样本交错的声道顺序相同。
typedef struct
{
float value; /* signed value of peak */
unsigned long position; /* the sample frame for the peak */
} PositionPeak;
<value> 是有符号的峰值。 值 1.0 表示非浮点编码的 0dBFS。
<position> 是出现峰值的样本帧编号。 请注意,位置的单位是样本帧,而不是样本点或字节。