1

我有一个程序读取

4096 frames (16384 bytes)
16bit LE
48000 Hz
PCM

每次从内核模块“读取”到一个 16384 字节的大缓冲区(= 从 ALSA 的环形缓冲区读取)。

每次“读取”后,我必须将 48 kHz 下采样到 44.1 kHz,并且输出必须更小/等于 4096 帧(流式传输到 Apple 的 Airport Express)。

它已经工作了,但是输出听起来“太快”并且“闪烁”(我认为是由于“读取”中的帧丢失,如下所述),然后有时会停止(我认为“太快”会导致“等待数据” )。

对于重采样,我使用libsamplerate中的src_process(又名 Secret Rabbit Code):

int src_process (SRC_STATE *state, SRC_DATA *data) ;

具有以下参数:

  data_in       : A pointer to the input data samples.
  input_frames  : 4096
  data_out      : A pointer to the output data samples.
  output_frames : 4096
  src_ratio     : 44100 / 48000 -> 0,91875

当我错过了 ALSA 内部环形缓冲区中的一些帧时,我的内核模块会告诉我,这会发生。

我缺少大约 100 帧/“读取”。

也许有人理解这个问题并可以说“4096 帧缓冲区太小”或其他内容。

同时我会重新检查我的代码。

4

0 回答 0