【问题标题】:How to calculate number of samples in audio given some parameters?给定一些参数,如何计算音频中的样本数?
【发布时间】:2012-03-24 01:13:25
【问题描述】:

给定以下参数:

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。

【问题讨论】:

    标签: c++ qt audio signal-processing


    【解决方案1】:

    这里是伪代码的解决方案:

    鉴于

    持续时间 = 20... 以毫秒为单位 & sr = 11025 ... 以赫兹为单位的采样率

    那么样本数N

    N = sr * dur/1000 = 220.5

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

    【讨论】:

      【解决方案2】:

      我认为在这里理解每个术语的含义很重要,这样您就可以编写代码来满足您的需求。

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

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

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

      因此,已发布的代码示例显示了如何将这些数字中的每一个一起应用以将您的毫秒数应用于样本,这只是将通道数乘以样本位数乘以采样率,从而为您提供一秒钟的数据大小音频,然后将此数字除以 1000 得到毫秒。

      当您开始将其应用于处理帧的视频时,这可能会变得非常棘手在这种情况下,您必须进行可怕的计算以确保它们正确对齐。

      希望这会有所帮助。

      【讨论】:

      • 用户 perreal 提供了足够的代码示例,所以我认为最好不要复制。
      【解决方案3】:
         /**
           * 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

      【讨论】:

      • 如果我理解正确,我认为公式应该是(int)(((long) ms) * sampleRate * channels / 1000) / (sampleSize / 8)。我说的对吗?
      • 在计算样本数量时样本大小不相关,因为速率不是以字节为单位,而是以样本数量为单位。
      • sampleToBytes 的乘法中似乎缺少通道数。
      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 2015-11-08
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      相关资源
      最近更新 更多