linux中的音频流采样率

时间:2011-01-31 07:11:50

标签: linux audio-recording sampling

我尝试使用C / C ++从linux中的音频麦克风读取和存储样本。使用PCM ioctls我使用SOUND_PCM_WRITE_RATE ioctl等将设备设置为具有10Khz的特定采样率。设备正确设置并且在使用“读取”设置后能够从设备读回。

int got = read(itsFd, b.getDataPtr(), b.sizeBytes());

我遇到的问题是,在设置了适当的采样率之后,我有一个连续从/ dev / dsp1读取的线程并存储这些样本,但我获得1秒钟的采样数量远离采样速率和总是比设定的采样率高几个数量级。任何想法从哪里开始找出可能是什么问题?

编辑:

部分源代码:

/////////main loop
while(goforever) {

    // grab a buffer:
    AudioBuffer<uint16> buffer;
    agb->grab(buffer);

    pthread_mutex_lock(&qmutex_data);
    rec.push(buffer);
    pthread_mutex_unlock(&qmutex_data);
    if(tim.getSecs()>=5)
      goforever =false;
}

////////////grab function:

template <class T>
void AudioGrabber::grab(AudioBuffer<T>& buf) const
{

  AudioBuffer<T> b(itsBufsamples.getVal(),
                   itsStereo.getVal() ? 2U : 1U,
                   float(itsFreq.getVal()),
                   NO_INIT);
  int got = read(itsFd, b.getDataPtr(), b.sizeBytes());

  if (got != int(b.sizeBytes()))
    PLERROR("Error reading from device: got %d of %u requested bytes",
            got, b.sizeBytes());

  buf = b;
}

1 个答案:

答案 0 :(得分:3)

仅仅因为您要求10kHz的采样率,并不意味着您的硬件支持它。许多声卡只支持一个或两个采样率 - 例如我只支持这些:

$ grep -rH rates /proc/asound/ | cut -d : -f 2- | sort -u
    rates [0x160]: 44100 48000 96000
    rates [0x560]: 44100 48000 96000 192000
    rates [0x5e0]: 44100 48000 88200 96000 192000

因此,您必须检查 SOUND_PCM_WRITE_RATE ioctl()的返回值,以验证您是否获得了所需的费率,如上所述here

  

SOUND_PCM_WRITE_RATE

     

以每秒采样数设置采样率。记住所有的声音   卡片的范围有限制;该   司机将把费率四舍五入到   最近的速度支持   硬件,返回实际   论证中的(四舍五入)率。