如何计算给定参数的音频样本数?

问题描述:

考虑以下参数:如何计算给定参数的音频样本数?

Sample size: 16 
Channel count: 2 
Codec: audio/pcm 
Byte order: little endian 
Sample rate: 11025 
Sample type: signed int 

如何确定样本数为录制音频的N miliseconds?我是音频处理方面的新手。编解码器是PCM,所以我猜它是未压缩的音频。

我在Windows 7 Ultimate x64上使用Qt 4.8。

我认为你应该理解这些术语的意思,这样你就可以写上你想要的东西,让你的代码,它是在这里非常重要的。

采样率是每秒音频的采样数,在你的情况下11025(这有时用KHz表示),与CD音频44.1KHz等44100采样率相比这是相当低的,更高的标准如48KHz,96KHz。

接下来你有用于每个样本的位数,通常可以是8/16/24/32位。

接下来,您可以为每个样本设置任意数量的通道。

因此,已发布的代码示例显示了如何将这些数字中的每一个应用到一起,以便将采样速率乘以通道数乘以样本位的采样毫秒数,秒的音频,然后将这个数字除以1000来给你毫秒。

当你开始将这个视频处理成帧数为25/30/50/60帧的帧时,对于基于NTSC的帧为23.98/29.97/59.94帧一秒其次,在这种情况下,您必须进行可怕的计算才能确保它们正确对齐。

希望这会有所帮助。

+0

好,但最后没有公式... – UmNyobe 2012-03-06 15:07:31

+0

用户perreal提供了足够的代码示例,所以我认为最好不要重复。 – EdChum 2012-03-06 15:25:13

/** 
    * Converts milliseconds to samples of buffer. 
    * @param ms the time in milliseconds 
    * @return the size of the buffer in samples 
    */ 
    int msToSamples(int ms, int sampleRate, int channels) { 
     return (int)(((long) ms) * sampleRate * channels/1000); 
    } 

    /* get size of a buffer to hold nSamples */ 
    int samplesToBytes(int nSamples, int sampleSizeBits) { 
     return nSamples * (sampleSizeBits/8); 
    } 

Reference

+0

如果我理解正确,我认为公式应该是'(int)(((long)ms)* sampleRate * channels/1000)/(sampleSize/8)'。我对吗? – Donotalo 2012-03-06 16:15:45

+0

计算样本数时,样本大小不相关,因为速率没有以字节为单位,而是以样本数量定义。 – perreal 2012-03-06 16:22:03

+0

它看起来像samplesToBytes缺少其乘法中的通道数量。 – rationalcoder 2015-12-03 16:03:10

在这里,在伪代码中的溶液:以Hz

鉴于

持续时间= 20 ...以毫秒为单位& SR = 11025 ... samplingrate

然后样品的数目N

N = sr * dur/1000 = 220.5

您需要将其四舍五入到最接近的整数。