PulseAudio tergagap

12

Saya telah menginstal raspbian pada Pi saya dan mengkonfigurasi wastafel PulseAudio dengan maksud untuk mengalirkan semua audio dari desktop saya ke Pi, menggerakkan pengeras suara.

Saya mengikuti deskripsi yang bagus ini: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=38&t=11124

Pada awalnya, ini tampaknya berhasil tanpa masalah. Namun, audio yang dikirim dari desktop terus-menerus tergagap pada Pi, seolah-olah ada buffer underruns yang konstan dengan hanya beberapa sampel yang hilang di antaranya.

Saya menghabiskan sepanjang hari berusaha mencari penyebabnya, tetapi tidak berhasil. Pengaturan dasar adalah:

  • koneksi LAN kabel
  • pi raspbian terbaru (26 Sep 2013) dengan pembaruan firmware terbaru
  • PulseAudio 2.0 di kedua sisi (desktop Ubuntu)
  • Putar ulang melalui mplayer, totem, ffplay
  • transmisi jaringan melalui module-native-protocol-tcp

Inilah yang saya coba:

  • Memutar audio langsung di Pi berfungsi dengan sempurna.
  • Streaming ke komputer lain (desktop) berfungsi dengan baik.
  • Mengirim audio dengan koneksi langsung (menentukan $ PULSE_SERVER) berfungsi cukup baik dengan sedikit gagap, tetapi masih rentan terhadap Masalah-2 (lihat di bawah)
  • Mengirim audio melalui desktop PulseAudio tunneling memberikan kegagapan konstan
  • Meningkatkan prioritas / penjadwalan waktu nyata ... tidak membantu
  • Memperbaiki laju pengambilan sampel hingga 48 kHz ... tidak membantu
  • Mengatur algoritma resampling ke "trivial" ... tidak membantu
  • Menyesuaikan ukuran fragmen / fragmen default ... tidak membantu
  • Saya tidak dapat menemukan indikasi masalah dalam log PulseAudio (ditunjukkan sejak saya mulai pemutaran):

    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 ...
    

Masalah 2: seperti yang dikatakan di atas, saya bisa mendapatkan audio yang cukup ok dengan koneksi langsung. Namun, setelah beberapa lompatan dalam aliran (menggunakan mplayer), server PulseAudio hang dan tidak memainkan audio sama sekali. Kadang-kadang dapat dihidupkan kembali dengan me-restart mplayer. Terkadang hang sangat buruk sehingga PulseAudio harus dihidupkan ulang. Kadang-kadang bahkan hang ketika saya hanya mengubah level volume.

Menurut dokumen PulseAudio, keuntungan dari koneksi langsung melalui koneksi tunnelled adalah memiliki kontrol buffering yang lebih baik, yang tampaknya menunjukkan mengapa saya mendapatkan audio yang bagus dengan koneksi langsung: http://www.freedesktop.org/wiki/Software / PulseAudio / Dokumentasi / Pengguna / Jaringan /

Saya kehabisan ide sekarang. Apa yang bisa menyebabkan gagap dan Masalah 2? Hanya sebuah ide bagaimana melanjutkan debugging juga akan dihargai.

farindk
sumber
Bagaimana Anda memutar audio secara langsung? Saya tidak punya masalah dengan aplay, tetapi gagap paplay dan gema sangat.
John La Rooy
Saya menggunakan mplayer, totem, madplay, ... Tetapi fakta bahwa pemain yang berbeda berperilaku berbeda mendukung dugaan saya bahwa itu tampaknya menjadi masalah perangkat lunak dengan buffering data. Beberapa pemain mendorong lebih banyak data di depan waktu nyata daripada yang lain.
farindk
Saya mengalami masalah hanya bermain gelombang sinus . Saya pikir saya harus menyelesaikannya sebelum saya dapat mencoba streaming melalui LAN.
John La Rooy

Jawaban:

6

tsched_buffer_sizedan tsched_buffer_watermarkpengaturan yang membuatnya bekerja untuk saya.

Saya menjalankan PulseAudio saya sebagai contoh sistem, jadi konfigurasinya ada di /etc/pulse/system.pa. Jika Anda menggunakan contoh sesi sebagai gantinya, maka konfigurasi akan berada di /etc/pulse/default.pa.

Ini standarnya:

### 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

Saya menggantinya dengan ini: (yaitu, berkomentar)

### 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

Kemudian saya menambahkan baris berikut:

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

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

Phil
sumber
Poin yang bagus. Saya mencoba, tetapi itu tidak membantu. Bahkan dengan ukuran buffer yang jauh lebih besar. Mengirim audio melalui koneksi langsung dengan mengatur PULSE_SERVER ke Pi memberikan audio yang bersih, tetapi hanya dengan mengubah volume akhirnya akan membekukan koneksi. Audio via tunneling masih memberikan kegagapan. Dugaan saya adalah bahwa ini benar-benar masalah PulseAudio, karena dengan ukuran buffer yang besar (saya menggunakan 4 MB), orang harus melihat bahwa audio diterjemahkan jauh sebelumnya di awal file. Tapi ternyata tidak. Jadi pasti ada sesuatu yang memperlambat isi ulang.
farindk
Berlari ke masalah yang sama. Dalam kasus khusus saya, PULSE_SERVER + mplayer bekerja seperti pesona, sedangkan PULSE_SERVER + clementine (yang saya percaya menggunakan gstreamer) tergagap sangat. Adakah yang tahu perbedaan antara keduanya?
Jonathan Protzenko
@Protzenko: Dugaan saya tanpa melihat sumber apa pun adalah bahwa mplayer mungkin mendorong data sampai PulseAudio memblokir, sementara gstreamer mungkin mengirimkan data yang dicentang dengan referensi waktu nyata. Itu berarti bahwa buffer lebih diisi pada kasus sebelumnya, dan akibatnya, ada penundaan yang lebih besar.
farindk
Saya melihat masalah yang sama PULSE_SERVER + ffmpeg baik-baik saja, PULSE_SERVER + penutup jendela mpd dan underruns implisit
Reimundo Heluani
3

Poin utama adalah bahwa Anda harus menggunakan module-tunnel-sink-new, tetapi Anda juga harus membuat beberapa perubahan lain untuk mendapatkan audio jaringan yang bebas gangguan pada raspberry pi 1.

  1. Jalankan pulseaudio pada raspberry pi dengan prioritas waktu nyata:
pulseaudio --start --high-priority=yes --realtime=yes

Mari kita gunakan istilah pengirim untuk menunjukkan komputer yang mengirimkan aliran ke raspberry pi Anda.

  1. Setel default-fragmentsdan default-fragment-size-msecmasuk daemon.confpada pengirim ke nilai-nilai ini:
default-fragments = 8
default-fragment-size-msec = 12
  1. Gunakan module-tunnel-sink-newdengan mengeluarkan perintah ini di pengirim (dengan asumsi nama host raspberry pi Anda adalah RP1 dan Anda memiliki mDNS yang bekerja di jaringan lokal Anda. Jika tidak, gunakan saja alamat IP pi raspberry Anda).
pactl load-module module-tunnel-sink-new server=RP1.local

Dengan pengaturan ini saya mendapatkan audio bebas gagap dari raspberrypi 1 melalui jaringan nirkabel yang beroperasi pada 54 Mbps (Dalam pengaturan saya, pengirim menggunakan ethernet dan RP1 menggunakan wlan). Sebenarnya, ini berfungsi bahkan ketika pengirim dan raspberrypi menggunakan wlan, setidaknya jika tidak ada perangkat lain di jaringan nirkabel.

Hans Ekbrand
sumber
Sejauh ini berfungsi dengan baik. Saya menemukan bahwa untuk Pi3 saya (dengan debian / software yang agak baru) saya harus mengubah sesuatu yang lain untuk pengaturan "default-fragmen" untuk diambil. (yaitu, pengaturan sesuatu tsched=0, lihat wiki.archlinux.org/index.php/PulseAudio/… )
rien333
Jika Anda masih mengalami kegagapan, wiki lengkung juga merekomendasikan untuk mengubah protokol streaming rtp
rien333
1

apakah Anda melihat halaman ini:

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

PENGATURAN FRAGMENT DEFAULT

   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).
Alter Schwede
sumber
Ya, sudah mencobanya, tetapi itu tidak membantu. Seperti yang saya sebutkan, pemutaran audio pada perangkat itu sendiri berfungsi dengan baik. Saya menganggap ini masalah protokol jaringan dengan tunneling PulseAudio. Bahkan protokol koneksi langsung berfungsi dengan baik. Saya sekarang telah beralih ke perangkat keras streaming Bluetooth sederhana, yang dapat diandalkan dan menggunakan RPi untuk hal-hal lain.
farindk
1

Untuk menghilangkan masalah kegagapan atau batas waktu, cobalah downgrade FW:

sudo rpi-update eeb2e51c3e08cd5efa4246aa8dc54a09b25ada12
pengguna13034
sumber
1
PERINGATAN Waspadai apa yang rpi-updatebisa dilakukan oleh mode ini untuk sistem Anda.
earthmeLon
@earthmeLon Anda setidaknya bisa memberikan referensi atau mencoba memberi tahu kami apa yang rpi-updatedapat dilakukan dengan cara ini untuk sistem kami ...
user11171
Pastikan untuk Membaca Manual , dan lakukan riset untuk memahami bagaimana ini memengaruhi sistem Anda dan segala potensi bahaya.
earthmeLon
0

Saya menyadari bahwa masalah ini mungkin terkait dengan versi kernel. Setelah memutakhirkan dari 3.6.11 ke 3.12.0 Saya selalu menerima underruns tersebut. Downgrade kembali ke 3.6.11 menyelesaikan masalah bagi saya.

Manuel Faux
sumber
0

Saya telah membaca halaman ini beberapa kali ... Saya juga merasa frustrasi dengan gagapnya kombinasi jaringan RaspberryPi-pulseaudio. Saya mencari sedikit lebih banyak dan menemukan halaman di mana saya menemukan bagian dari solusi:

=> Nonaktifkan module-suspend-on-idle di default.pa (atau system.pa).

Lihatlah, kegagapan telah hilang!

Sekarang satu-satunya masalah adalah bahwa setelah beberapa saat (10 hingga 20 detik) pemutaran hang: - /

Ada saran?

Jørn Christensen
sumber