1

我已将IMX板背靠背连接到电脑。我在板上运行一个二进制文件,它每 5.7 毫秒发送 1024 个字节的音频帧。pc接收帧并使用

printf("snd_pcm_avail %d \n",snd_pcm_avail (FMWK.FMWK_Handler.playback_handle));

err = snd_pcm_writei(FMWK.FMWK_Handler.playback_handle, OutputPointer, PERIOD_BYTES);

播放时,每 6 秒后我的管道就会损坏

运行成功播放时的日志

snd_pcm_avail 32 
snd_pcm_avail 17 
snd_pcm_avail 81 
snd_pcm_avail 25 
snd_pcm_avail 89 
snd_pcm_avail 32 
snd_pcm_avail 17 
snd_pcm_avail 81 
snd_pcm_avail 32 
snd_pcm_avail 17 
snd_pcm_avail 81 
snd_pcm_avail 25 
snd_pcm_avail 89 
snd_pcm_avail 32 
snd_pcm_avail 17 
snd_pcm_avail 81 

大约减少 56 当 5 秒后使用率增加并且缓冲区溢出 buffer_size=256 的配置限制

日志:

snd_pcm_avail 89 
snd_pcm_avail 112 
snd_pcm_avail 96 
snd_pcm_avail 120 
snd_pcm_avail 104 
snd_pcm_avail 129 
snd_pcm_avail 153 
snd_pcm_avail 137 
snd_pcm_avail 160 
snd_pcm_avail 184 
snd_pcm_avail 168 
snd_pcm_avail 193 
snd_pcm_avail 176 
snd_pcm_avail 201 
snd_pcm_avail 224 
snd_pcm_avail 209 
snd_pcm_avail 232 
snd_pcm_avail 217 
snd_pcm_avail 240 
snd_pcm_avail -32 
   (AVB Info)     12:26:11 PM.606306  (Slave)               ==> Broken pipe
snd_pcm_avail 256 
snd_pcm_avail 48 

我已将 period_size 设置为 128

我不确定我是否在 snd_pcm 的初始配置中遗漏了什么?它是44.1khz音频。

4

2 回答 2

3

发生的情况是,您的程序无法跟上设备对 PCM 数据的播放。当“Broken pipe”发生音频设备时,它会等待新的样本,但您的程序没有及时交付它们。

您遇到的情况是在线音频系统的祸根;不幸的是,现有的 Linux 音频架构 (ALSA) 并不能很好地发挥作用;PulseAudio + RealtimeKit尝试(恕我直言,不是很成功)在裂缝上抹灰,通过做奇怪和疯狂的巫术来不让 ALSA 司机挨饿;由于某些驱动程序被破坏并且没有正确报告播放头的位置,事情并没有变得更好。

在您的情况下,您可以做两件事:

  • 使用更大的帧(缓冲区中的更多样本)
  • 排队更多帧(排队几个缓冲区)并在队列中保持最小数量的帧
于 2014-05-21T08:25:55.307 回答
2

音频设备通常有自己的采样时钟,它与系统时钟不同步。

因此,您不能使用系统时钟来控制将样本发送到设备的速度;它会在几乎所有系统上运行太快或太慢。

要以正确的速度发送样本,请尽可能快地编写样本;snd_pcm_write* 如果缓冲区已满,将自动等待。

如果你无法从接收方控制发送方的速度(因为它们不在同一台机器上,并且你没有提供反馈的协议),你必须测量发送方和接收方的相对速度,并适当地重新采样数据.

于 2014-05-21T09:30:51.627 回答