Заїкання раковиною PulseAudio


12

Я встановив raspbian на своєму Pi і налаштував раковину PulseAudio з наміром передавати все аудіо з мого робочого столу на Pi, керуючи гучномовцями.

Я дотримувався цього приємного опису: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=38&t=11124

Спочатку це, здавалося, спрацювало без проблем. Однак аудіо, надіслане з робочого столу, постійно заїкається на Pi, як ніби між ними відсутні постійні підписки буфера, де пропущено лише кілька зразків.

Я провів цілий день, намагаючись знайти причину, але безрезультатно. Основна установка:

  • провідне підключення до локальної мережі
  • найновіша версія raspbian pi (26 вересня 2013 р.) з останніми оновленнями програмного забезпечення
  • PulseAudio 2.0 з обох сторін (робочий стіл Ubuntu)
  • Відтворення через програвач mplayer, totem, ffplay
  • передача мережі через модуль-native-Protocol-tcp

Це те, що я спробував:

  • Відтворення аудіо безпосередньо на Pi працює бездоганно.
  • Потокове передавання на інші (настільні) комп’ютери працює чудово.
  • Надсилання аудіо з прямим з'єднанням (із зазначенням $ PULSE_SERVER) працює досить добре з дуже невеликим заїканням, але все ще схильний до проблеми-2 (див. Нижче)
  • Відправлення аудіо через настільний PulseAudio тунелювання дає постійне заїкання
  • Збільшення пріоритетів / планування в режимі реального часу ... не допомогло
  • Виправлення частоти дискретизації до 48 кГц ... не допомогло
  • Встановлення алгоритму перекомпонування на "тривіальне" ... не допомогло
  • Налаштування фрагментів за замовчуванням / розміру фрагмента ... не допомогло
  • Я не можу знайти жодних ознак проблеми в журналах 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 зависає і взагалі не відтворює аудіо. Іноді це можна відродити, перезапустивши програвач. Іноді він висить так погано, що PulseAudio доведеться перезапустити. Іноді він навіть зависає, коли я змінюю лише рівень гучності.

Згідно з документами PulseAudio, перевага прямого з'єднання над тунельним з'єднанням полягає в кращому буферному керуванні, що, схоже, вказує на те, чому я отримую гарне аудіо при прямому з'єднанні: http://www.freedesktop.org/wiki/Software / PulseAudio / Документація / Користувач / Мережа /

Зараз я не в ідеях. Що може спричинити заїкання та проблему 2? Буде також вдячна ідея, як продовжувати налагодження.


Як ви відтворювали аудіо безпосередньо? У мене не було проблем з програванням, але Paplay заїкається і лунає страшенно.
Джон Ла Рой

Я використовував mplayer, totem, madplay, ... Але той факт, що різні гравці поводяться по-різному, підтверджує мою здогаду, що це, здається, проблема програмного забезпечення з буферизацією даних. Деякі гравці висувають більше даних попереду в реальному часі, ніж інші.
farindk

У мене виникають проблеми, просто граючи на синусоїді . Я думаю, що мені потрібно буде це вирішити, перш ніж я можу спробувати потокове передавання через локальну мережу.
Джон Ла Руй

Відповіді:


6

tsched_buffer_sizeі чи tsched_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


Гарна думка. Я спробував, але це не допомогло. Навіть із значно більшими розмірами буфера. Надсилання аудіо через пряме з'єднання, встановивши PULSE_SERVER на Pi, видає чистий звук, але лише зміна гучності з часом заморозить з'єднання. Аудіо за допомогою тунелювання все ще дає заїкання. Я здогадуюсь, що це справді проблема PulseAudio, тому що при великих розмірах буфера (я використав 4 МБ) слід побачити, що аудіо декодується достроково на початку файлу. Але це не так. Тож повинно бути щось уповільнення заправки.
farindk

Зустрічаючись з такими ж проблемами. У моєму конкретному випадку PULSE_SERVER + mplayer працює як шарм, тоді як PULSE_SERVER + клементин (який, на мою думку, використовує gstreamer) страшенно заїкається. Будь-яка ідея, чим вони відрізняються?
Джонатан Проценко

@Protzenko: Моя здогадка, не дивлячись на жодне джерело, полягає в тому, що mplayer може натискати дані, поки PulseAudio не блокується, тоді як gstreamer може надсилати дані, накладені в режимі реального часу. Це означало б, що буфери набагато більше заповнюються в попередньому випадку, і, отже, є більша затримка.
farindk

Я бачу ту саму проблему PULSE_SERVER + ffmpeg штрафу, PULSE_SERVER + mpd стулки та неявні
підписки

3

Основний момент полягає в тому, що ви повинні використовувати module-tunnel-sink-new, але ви також повинні внести кілька інших змін, щоб отримати бездротове мережеве аудіо на малиновому пі 1

  1. Запустіть pulseaudio на малиновому пі з пріоритетом у режимі реального часу:
pulseaudio --start --high-priority=yes --realtime=yes

Давайте використаємо термін відправник для позначення комп'ютера, який надсилає потік до вашого малинового пі.

  1. Встановити default-fragmentsі default-fragment-size-msecв daemon.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

За допомогою цих налаштувань я отримую звук без заїкання з малинового 1 через бездротову мережу, яка працює зі швидкістю 54 Мбіт / с (у моїх налаштуваннях відправник використовує Ethernet, а RP1 використовує wlan). Насправді це працює навіть тоді, коли і відправник, і малинові машини використовують wlan, принаймні, якщо в бездротовій мережі немає інших пристроїв.


Наразі чудово працює. Я виявив, що для свого Pi3 (з дещо новим дебіаном / програмним забезпеченням) мені довелося змінити щось інше для налаштування "фрагментів за замовчуванням", які потрібно вибрати. (а саме щось налаштування tsched=0, див. wiki.archlinux.org/index.php/PulseAudio/… )
rien333

Якщо ви все ще відчуваєте заїкання, арка wiki також рекомендує змінити протокол потокового потоку 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. Навіть протокол прямого з'єднання працює добре. Зараз я перейшов до простого апаратного потокового обладнання Bluetooth, яке є надійним і використовує RPi для інших речей.
farindk

1

Щоб позбутися проблем із заїканням чи тайм-аутом, спробуйте зменшити FW:

sudo rpi-update eeb2e51c3e08cd5efa4246aa8dc54a09b25ada12

1
ПОПЕРЕДЖЕННЯ Будьте в курсі того, що rpi-updateтаким чином можна використовувати для вашої системи.
earthmeLon

@earthmeLon, ви можете принаймні дати посилання або спробувати повідомити нам, що rpi-updateтаким чином можна використовувати для наших систем ...
user11171

Не забудьте прочитати посібник та провести деякі дослідження, щоб зрозуміти, як це впливає на вашу систему та будь-які потенційні небезпеки.
земляLon

0

Я визнав, що ця проблема може бути пов’язана з версією ядра. Після оновлення з 3.6.11 до 3.12.0 я постійно отримував ці недоїдання. Пониження рівня до 3.6.11 вирішило проблему для мене.


0

Я читав цю сторінку пару разів ... Мене також розчарувало заїкання комбінації RaspberryPi-pulseaudio-мережі. Я трохи більше пошукав і знайшов сторінку, де знайшов частину рішення:

=> Вимкнути модуль-призупинення роботи в режимі очікування в default.pa (або system.pa).

Ось заїкання зникло!

Тепер єдина проблема полягає в тому, що через деякий час (від 10 до 20 секунд) відтворення зависає: - /

Будь-які пропозиції?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.