我在规范的 WAV 结构中看不到这样的字段,但也许可以使用现有的字段?
我知道我们可以很容易地计算 PCM 流的样本数(raw_sound_data_size / (bits_pers_sample / 8)
),但是如何处理 ADPCM?
通常 Subchank2Size是以字节为单位的数据大小。和bitsPerSample样本中有多少位。所以样本数应该是:
samples = Subchank2Size / channels / ( bitsPerSample / 8 ).
对于未压缩的数据也是如此
ADPCM 数据保存在“块”中。该块包含三个部分,标题、数据和填充。这三个一起是 <nBlockAlign> 字节。
标题
typedef struct adpcmblockheader_tag {
BYTE bPredictor[nChannels];
int iDelta[nChannels];
int iSamp1[nChannels];
int iSamp2[nChannels];
} ADPCMBLOCKHEADER;
数据
数据是按 (wBitsPerSample * nChannels) 组解析的位串。
填充
位填充用于将块四舍五入到精确的字节长度。
有关解码 ADPCM 格式的更多信息,请参见此处
不幸的是,如果不枚举所有块,似乎无法找到确切的样本数。