查找.wav文件和十六进制编辑器中的样本数

时间:2011-05-02 19:54:17

标签: audio hex hex-editors wav

需要有关十六进制编辑器和音频文件的帮助。我无法确定公式以获取.wav文件中的样本数。

我下载了StripWav,它告诉我.waves中的样本数量,但仍无法弄清楚公式。

请你下载这两个.wavs,在十六进制编辑器中打开它们,并告诉我获取样本数量的公式。

如果你这样对我这么好,请告诉我每个.wav的样本数量,这样我就能确保公式正确。

http://sinewavemultimedia.com/1wav.wav http://sinewavemultimedia.com/2wav.wav

这是一个问题,我有两个程序,

一个读取wav数据,另一个显示numsamples 这是数据

RIFF 'WAVE' (wave file)
        <fmt > (format description)
                PCM format
                2 channel
                44100 frames per sec
                176400 bytes per sec
                4 bytes per frame
                16 bits per sample
        <data> (waveform data - 92252 bytes)

但另一个程序说NumSamples是

23,063 samples

/ * ** * ** * 更新 * ** * ** * ** / 还有一件事我用2个文件进行了计算 这个是正确的

92,296 bytes and num samples is 23,063` 

但是另外一个没有正确出来它超过2兆我刚刚减去了44个字节我在这里做错了吗?这是文件大小

2,473,696 bytes 

但正确的numsamples是

 617,400

3 个答案:

答案 0 :(得分:1)

确定WAV文件中的样本数没有简单的公式。所谓的“规范”WAV文件包含一个44字节的标题,后跟实际的样本数据。因此,如果您知道该文件每个样本使用2个字节,则样本数等于文件大小(以字节为单位)减去44(对于标题),然后除以2(因为每个字节有2个字节)样品)。

不幸的是,并非所有的WAV文件都像这样“规范”。 WAV文件使用RIFF格式,因此解析WAV文件的正确方法是搜索文件并找到各种块。

以下是一个示例(不确定您需要使用哪种语言):

http://msdn.microsoft.com/en-us/library/ms712835

答案 1 :(得分:1)

WAVE format

您必须读取fmt标头以确定每个样本的通道数和位数,然后读取data块的大小以确定音频中有多少字节数据。然后:

NumSamples = NumBytes / (NumChannels * BitsPerSample / 8)

答案 2 :(得分:0)

WAVE format chunkfmt)每个样本框都有&#39;字节&#39;指定为wBlockAlign
所以:framesTotal = data.ck_size / fmt.wBlockAlign;
samplesTotal = framesTotal * wChannels;
因此,samplesTotal===FramesTotal IIF wChannels === 1 !!

请注意上述答案如何优雅地避免解释关键方程式规范(以及基于它们的答案)是错误的: 考虑flor例子,每秒2通道12比特波 该规范解释了我们将每个12bps样本放在一个单词中:

  note: t=point in time, chan = channel
+---------------------------+---------------------------+-----
|         frame 1           |         frame 2           |  etc
+-------------+-------------+-------------+-------------+-----
| chan 1 @ t1 | chan 2 @ t1 | chan 1 @ t2 | chan 2 @ t2 |  etc
+------+------+------+------+------+------+------+------+-----
| byte | byte | byte | byte | byte | byte | byte | byte |  etc
+------+------+------+------+------+------+------+------+-----

那么.. 2ch 12bps波的样本帧(BlockAlign)有多少字节符合规范?
&LT;讽刺&GT; CEIL(wChannels * bps / 8) = 3个字节..&lt; / sarcasm&gt;
显然,正确的等式是:wBlockAlign=wChannels*CEIL(bps/8)