PulseAudio水槽口吃


12

我在Pi上安装了raspbian并配置了PulseAudio接收器,目的是将所有音频从台式机流式传输到Pi,从而驱动扬声器。

我遵循了这个很好的描述:http : //www.raspberrypi.org/phpBB3/viewtopic.php?f= 38&t= 11124

最初,这似乎没有问题。但是,从台式机发送的音频在Pi上始终不停地发出声音,好像缓冲区持续欠载,中间只有几个采样丢失。

我整天都在努力寻找原因,但无济于事。基本设置是:

  • 有线局域网连接
  • 最新的树莓派(2013年9月26日)具有最新的固件更新
  • 两侧都有PulseAudio 2.0(Ubuntu桌面)
  • 通过mplayer,图腾,ffplay播放
  • 通过模块本地协议tcp进行网络传输

这是我尝试的:

  • 直接在Pi上播放音频效果很好。
  • 流式传输到其他(台式)计算机工作正常。
  • 通过直接连接(指定$ PULSE_SERVER)发送音频效果很好,很少卡顿,但仍然容易出现问题2(请参阅下文)
  • 通过桌面PulseAudio隧道发送音频可提供持续的卡顿
  • 增加优先级/实时调度...无济于事
  • 将采样率固定为48 kHz ...无济于事
  • 将重采样算法设置为“琐碎” ...无济于事
  • 调整默认片段/片段大小...无济于事
  • 我在PulseAudio日志中没有发现任何问题的迹象(从开始播放时开始显示):

    D: [alsa-sink] protocol-native.c: Requesting rewind due to end of underrun.
    D: [alsa-sink] sink-input.c: Requesting rewind due to uncorking
    D: [pulseaudio] sink.c: Suspend cause of sink alsa_output.platform-bcm2835_AUD0.0.analog-stereo is 0x0000, resuming
    I: [alsa-sink] alsa-sink.c: Trying resume...
    I: [alsa-sink] alsa-util.c: cannot disable ALSA period wakeups
    D: [alsa-sink] alsa-util.c: Maximum hw buffer size is 341 ms
    D: [alsa-sink] alsa-util.c: Set buffer size first (to 16384 samples),  period size second (to 16384 samples).
    I: [alsa-sink] alsa-util.c: ALSA period wakeups were not disabled
    D: [alsa-sink] alsa-sink.c: Latency set to 25.00ms
    D: [alsa-sink] alsa-sink.c: hwbuf_unused=60736
    D: [alsa-sink] alsa-sink.c: setting avail_min=15665
    I: [alsa-sink] alsa-sink.c: Time scheduling watermark is 15.00ms
    I: [alsa-sink] alsa-sink.c: Resumed successfully...
    I: [alsa-sink] alsa-sink.c: Starting playback.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [pulseaudio] module-suspend-on-idle.c: Sink alsa_output.platform-bcm2835_AUD0.0.analog-stereo becomes busy.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] alsa-sink.c: Cutting sleep time for the initial iterations by half.
    D: [alsa-sink] ratelimit.c: 115 events suppressed
    D: [alsa-sink] alsa-sink.c: Wakeup from ALSA!
    ... no more output, but stuttering continues ...
    

问题2:如上所述,通过直接连接我可以得到很好的音频。但是,在流中跳过几次(使用mplayer)之后,PulseAudio服务器挂起,根本不播放任何音频。有时可以通过重新启动mplayer来恢复它。有时它挂得很厉害,以至于必须重新启动PulseAudio。当我仅更改音量时,有时甚至挂起。

根据PulseAudio文档,直接连接优于隧道连接的优点是具有更好的缓冲控制,这似乎说明了为什么我可以通过直接连接获得良好的音频:http : //www.freedesktop.org/wiki/Software / PulseAudio /文档/用户/网络/

我现在没主意了。是什么导致口吃和问题2?只是一个想法如何进行调试也将不胜感激。


您是如何直接播放音频的?我对aplay没问题,但是paplay结结巴巴,令人回味。
John La Rooy 2014年

我使用了mplayer,图腾,madplay……。但是不同玩家的行为不同,这一事实支持了我的猜测,即这似乎是数据缓冲的软件问题。一些播放器比其他播放器更实时地推送更多数据。
farindk 2014年

我在演奏正弦波时遇到麻烦。我想在尝试通过LAN进行流传输之前,需要解决该问题。
约翰·拉鲁伊

Answers:


6

tsched_buffer_sizetsched_buffer_watermark人,使得它为我工作的设置。

我将PulseAudio作为系统实例运行,因此配置位于/etc/pulse/system.pa。如果您使用的是会话实例,则配置位于中/etc/pulse/default.pa

这是默认值:

### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
load-module module-udev-detect
.else
### Use the static hardware detection module (for systems that lack udev/hal  support)
load-module module-detect
.endif

我将其替换为:(即,注释掉了)

### Automatically load driver modules depending on the hardware available
.ifexists module-udev-detect.so
#load-module module-udev-detect
.else
### Use the static hardware detection module (for systems that lack udev/hal  support)
#load-module module-detect
.endif

然后我添加了以下行:

load-module module-alsa-card device_id=0 tsched=true tsched_buffer_size=1048576 tsched_buffer_watermark=262144

参见http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/#index6h3


好点子。我尝试过,但没有帮助。即使缓冲区大得多。通过将Pi设置为PULSE_SERVER来通过直接连接发送音频可得到清晰的音频,但是仅改变音量最终会冻结连接。通过隧道传输的音频仍然会产生卡顿现象。我的猜测是这确实是PulseAudio问题,因为使用如此大的缓冲区大小(我使用了4 MB),应该看到在文件开头提前对音频进行了解码。但事实并非如此。因此,必须有一些放慢填充速度的步骤。
farindk

遇到同样的问题。在我的特定情况下,PULSE_SERVER + mplayer的工作原理就像是一种魅力,而PULSE_SERVER + clementine(我相信它正在使用gstreamer)则非常口吃。知道两者之间有什么区别吗?
乔纳森·普罗琴科2014年

@Protzenko:我的猜测是,在没有发现任何消息的情况下,mplayer可能会推送数据,直到PulseAudio阻塞为止,而gstreamer可能会发送由实时引用计时的数据。这将意味着在前一种情况下缓冲区将更多地被填充,因此会有更大的延迟。
farindk 2014年

我看到相同的问题PULSE_SERVER + ffmpeg很好,PULSE_SERVER + mpd百叶窗和隐式欠载
Reimundo Heluani

3

要点是必须使用module-tunnel-sink-new,但还必须进行一些其他更改才能在raspberry pi 1上获得无干扰的网络音频。

  1. 以实时优先级在树莓派上运行pulseaudio:
pulseaudio --start --high-priority=yes --realtime=yes

让我们使用术语“ 发送者”来表示将流发送到您的树莓派的计算机。

  1. 设置default-fragmentsdefault-fragment-size-msecdaemon.conf发送这些值:
default-fragments = 8
default-fragment-size-msec = 12
  1. module-tunnel-sink-new通过在发送方发出此命令来使用(假设您的树莓派的主机名是RP1,并且您的本地网络上正在运行mDNS。否则,只需使用您的树莓派的IP地址)。
pactl load-module module-tunnel-sink-new server=RP1.local

通过这些设置,我可以通过以54 Mbps速度运行的无线网络从raspberrypi 1获得无干扰的音频(在我的设置中,发件人使用以太网,而RP1使用wlan)。实际上,即使在发件人和raspberrypi都使用wlan的情况下,它也可以工作,至少在无线网络上没有其他设备的情况下。


到目前为止效果很好。我确实发现,对于我的Pi3(使用较新的debian /软件),我必须更改其他内容才能使用“默认片段”设置。(即,一些设置tsched=0,见wiki.archlinux.org/index.php/PulseAudio/...
rien333

如果您仍然遇到口吃,拱维基还建议改变的RTP流协议: wiki.archlinux.org/index.php/PulseAudio/...
rien333

1

您是否签出了此页面:

http://manpages.ubuntu.com/manpages/lucid/man5/pulse-daemon.conf.5.html

默认片段设置

   Some hardware drivers  require  the  hardware  playback  buffer  to  be
   subdivided  into  several  fragments.  It  is  possible to change these
   buffer metrics for machines with high  scheduling  latencies.  Not  all
   possible  values  that  may  be  configured  here  are available in all
   hardware. The driver will to find the nearest setting supported. Modern
   drivers that support timer-based scheduling ignore these options.

   default-fragments= The default number of fragments. Defaults to 4.

   default-fragment-size-msec=The  duration of a single fragment. Defaults
   to 25ms (i.e. the total buffer is thus 100ms long).

是的,尝试过,但是没有帮助。如前所述,设备本身的音频播放效果很好。我认为这是PulseAudio隧道的网络协议问题。甚至直接连接协议也能很好地工作。我现在已经切换到简单的蓝牙流硬件,该硬件可靠并且可以将RPi用于其他用途。
farindk 2014年

1

要摆脱口吃或超时问题,请尝试将固件降级:

sudo rpi-update eeb2e51c3e08cd5efa4246aa8dc54a09b25ada12

1
警告请注意rpi-update以这种方式使用会对系统造成什么影响。
EarthmeL15年

@earthmeLon您至少可以提供参考或尝试告诉我们rpi-update以这种方式使用可以对我们的系统起到什么作用……
user11171

请务必阅读《手册》,并进行一些研究以了解其如何影响您的系统以及任何潜在的危险。
EarthmeL17年


0

我已经读过几次这个页面了……我也为RaspberryPi-pulseaudio-network组合的卡顿而感到沮丧。我搜索了更多,发现找到解决方案一部分的页面

=>在default.pa(或system.pa)中禁用空闲状态的模块。

瞧瞧,口吃已经消失了!

现在唯一的问题是,经过一段时间(10到20秒)后,播放暂停:-/

有什么建议么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.