如何根据某些参数计算音频样本数?

6

给定以下参数:

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

我该如何确定记录音频 N 毫秒 的样本数?我是音频处理的新手。编解码器是PCM,因此我猜测这是未压缩的音频。
我在 Windows 7 Ultimate x64 上使用 Qt 4.8。
3个回答

11
   /**
     * 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);
    }

参考资料


我认为公式应该是(int)(((long) ms) * sampleRate * channels / 1000) / (sampleSize / 8),如果我理解正确的话。我是对的吗? - Donotalo
计算样本数量时,样本大小并不重要,因为速率不是以字节而是以样本数定义的。 - perreal
看起来 samplesToBytes 在乘法中没有考虑通道数量。 - rationalcoder

11

我认为你需要理解这些术语的含义,才能编写代码来实现自己想要的功能。

样本率是音频每秒钟采集的样本数,在您的情况下是11025(这有时用kHz表示),与CD音频相比较低,CD音频通常是44.1kHz,还有更高的标准,例如48kHz、96kHz。

接下来,每个样本使用的位数可以是8/16/24/32位。

接下来,每个样本可以有任意数量的声道。

因此,已发布的代码示例显示如何将这些数字组合在一起,以获取您的毫秒到样本数,这只需将声道数乘以样本位乘以样本率即可得到单秒音频数据大小,然后将这个数字除以1000即可得到毫秒。

当您开始将其应用于涉及帧的视频时,这可能变得非常棘手,因为它们可能是像每秒钟25/30/50/60帧这样美好的数字,也可能是基于NTSC的帧速率,例如23.98/29.97/59.94帧每秒,在这种情况下,您必须进行恶心的计算,以确保它们正确对齐。

希望这能有所帮助。


用户perreal已经提供了一个足够的代码示例,所以我认为最好不要重复。 - EdChum

1

以下是伪代码的解决方案:

给定

duration = 20 ... 毫秒 & sr = 11025 ... 采样率(单位:赫兹)

则样本数 N

N = sr * dur/1000 = 220.5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接