PulseAudio การจมการพูดติดอ่าง


12

ฉันได้ติดตั้ง raspbian บน Pi ของฉันและกำหนดค่าอ่างล้างจาน PulseAudio ด้วยความตั้งใจที่จะสตรีมเสียงทั้งหมดจากเดสก์ท็อปของฉันไปยัง Pi ขับลำโพง

ฉันได้ปฏิบัติตามคำอธิบายที่ดีนี้: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=38&t=11124

ตอนแรกสิ่งนี้ดูเหมือนว่าจะทำงานได้โดยไม่มีปัญหา อย่างไรก็ตามเสียงที่ส่งจากเดสก์ท็อปนั้นติดอยู่บน Pi อย่างต่อเนื่องราวกับว่ามีบัฟเฟอร์คงที่อยู่ภายใต้บัฟเฟอร์ที่มีตัวอย่างเพียงไม่กี่ตัวอย่างที่ขาดหายไป

ฉันใช้เวลาทั้งวันพยายามหาสาเหตุ แต่ก็ไม่มีประโยชน์ การตั้งค่าพื้นฐานคือ:

  • การเชื่อมต่อ LAN แบบผ่านสาย
  • raspbian pi ล่าสุด (26 ก.ย. 2556) พร้อมอัพเดตเฟิร์มแวร์ล่าสุด
  • PulseAudio 2.0 ทั้งสองด้าน (เดสก์ท็อป Ubuntu)
  • เล่นผ่าน mplayer, totem, ffplay
  • การส่งผ่านเครือข่ายผ่านโมดูล-native-protocol-tcp

นี่คือสิ่งที่ฉันพยายาม:

  • การเล่นเสียงโดยตรงบน Pi ทำงานได้อย่างสมบูรณ์แบบ
  • การสตรีมไปยังคอมพิวเตอร์อื่น ๆ (เดสก์ท็อป) นั้นใช้งานได้ดี
  • การส่งเสียงด้วยการเชื่อมต่อโดยตรง (ระบุ $ PULSE_SERVER) ทำงานได้ค่อนข้างดีด้วยการพูดติดอ่างเพียงเล็กน้อย แต่ก็ยังมีแนวโน้มที่จะเกิดปัญหา -2 (ดูด้านล่าง)
  • การส่งเสียงผ่านเดสก์ท็อป PulseAudio tunneling ช่วยให้การพูดติดอ่างคงที่
  • การเพิ่มลำดับความสำคัญ / การตั้งเวลาตามเวลาจริง ... ไม่ได้ช่วย
  • การแก้ไขอัตราการสุ่มตัวอย่างเป็น 48 kHz ... ไม่ได้ช่วย
  • การตั้งอัลกอริทึมการสุ่มตัวอย่างใหม่เป็น "trivial" ... ไม่ได้ช่วยอะไร
  • การปรับขนาดเริ่มต้น / ชิ้นส่วน - ขนาด ... ไม่ได้ช่วย
  • ฉันไม่พบข้อบ่งชี้ของปัญหาในบันทึกของ 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 docs ข้อได้เปรียบของการเชื่อมต่อโดยตรงผ่านการเชื่อมต่อแบบ tunnelled คือการควบคุมบัฟเฟอร์ที่ดีกว่าซึ่งดูเหมือนจะบ่งบอกว่าทำไมฉันถึงได้เสียงที่ดีด้วยการเชื่อมต่อโดยตรง: http://www.freedesktop.org/wiki/Software / PulseAudio / เอกสาร / ผู้ใช้ / เครือข่าย /

ตอนนี้ฉันหมดความคิดแล้ว สิ่งที่อาจทำให้เกิดการพูดติดอ่างและปัญหาที่ 2? เพียงแค่ความคิดวิธีการดำเนินการแก้ไขข้อบกพร่องก็จะได้รับการชื่นชม


คุณเล่นเสียงโดยตรงได้อย่างไร ฉันไม่มีปัญหากับการเล่น Aplay แต่ paplay stutters และ echos แย่มาก
John La Rooy

ฉันใช้ mplayer, totem, madplay, ... แต่ความจริงที่ว่าผู้เล่นที่แตกต่างกันทำหน้าที่สนับสนุนการคาดเดาของฉันที่แตกต่างกันดูเหมือนว่าจะเป็นปัญหาซอฟต์แวร์ที่มีการบัฟเฟอร์ข้อมูล ผู้เล่นบางคนผลักข้อมูลล่วงหน้ามากกว่าเวลาจริง
Farindk

ฉันมีปัญหาเพียงแค่เล่นคลื่นไซน์ ฉันคิดว่าฉันต้องแก้ปัญหาก่อนที่จะลองสตรีมผ่าน LAN
John La Rooy

คำตอบ:


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 MB) เราควรเห็นว่าเสียงถอดรหัสก่อนเวลาที่เริ่มต้นไฟล์ แต่มันไม่ใช่ ดังนั้นจะต้องมีสิ่งที่ชะลอตัวเติม
farindk

พบปัญหาประเภทเดียวกัน ในกรณีของฉันโดยเฉพาะ PULSE_SERVER + mplayer ทำงานได้อย่างมีเสน่ห์ในขณะที่ PULSE_SERVER + clementine (ซึ่งฉันเชื่อว่าใช้ gstreamer) stutters น่ากลัวมาก ความคิดใดที่แตกต่างระหว่างสองนี้
Jonathan Protzenko

@Protzenko: ฉันเดาโดยไม่ได้ดูแหล่งใด ๆ นั่นคือ mplayer อาจส่งข้อมูลจนกว่า PulseAudio จะปิดกั้นในขณะที่ gstreamer อาจส่งข้อมูลที่โอเวอร์คล็อกโดยการอ้างอิงแบบเรียลไทม์ นั่นหมายความว่าบัฟเฟอร์จะถูกเติมเต็มในกรณีก่อนหน้านี้มากขึ้นดังนั้นจึงมีความล่าช้ามากขึ้น
farindk

ฉันเห็นปัญหาเดียวกัน PULSE_SERVER + ffmpeg ปรับ, PULSE_SERVER + บานประตูหน้าต่าง mpd และการ
บุกรุก

3

ประเด็นหลักคือคุณต้องใช้module-tunnel-sink-newแต่คุณต้องทำการเปลี่ยนแปลงอื่น ๆ อีกสองสามอย่างเพื่อให้ได้เสียงเครือข่ายที่ปราศจากการพูดติดอ่างบน raspberry pi 1

  1. เรียกใช้ pulseaudio บนราสเบอร์รี่ pi พร้อมลำดับความสำคัญตามเวลาจริง:
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โดยการออกคำสั่งนี้ที่ผู้ส่ง (ยืนยันชื่อโฮสต์ของราสเบอร์รี่ pi ของคุณคือ RP1 และคุณมี mDNS ทำงานบนเครือข่ายท้องถิ่นของคุณมิฉะนั้นใช้ IP-adress ของราสเบอร์รี่ pi ของคุณ)
pactl load-module module-tunnel-sink-new server=RP1.local

ด้วยการตั้งค่าเหล่านี้ฉันได้รับเสียงพูดติดอ่างจาก raspberrypi 1 ผ่านเครือข่ายไร้สายที่ทำงานที่ 54 Mbps (ในการตั้งค่าของฉันผู้ส่งใช้อีเธอร์เน็ตและ RP1 ใช้ wlan) ที่จริงแล้วมันใช้งานได้แม้ว่าผู้ส่งและ raspberrypi กำลังใช้ wlan อย่างน้อยถ้าไม่มีอุปกรณ์อื่นในเครือข่ายไร้สาย


ใช้งานได้ดีจนถึงตอนนี้ ฉันพบว่าสำหรับ Pi3 ของฉัน (ด้วยเดเบียน / ซอฟต์แวร์ที่ค่อนข้างใหม่กว่า) ฉันต้องเปลี่ยนอย่างอื่นสำหรับการตั้งค่า "ชิ้นส่วนเริ่มต้น" ที่จะหยิบขึ้นมา (กล่าวคือการตั้งค่าบางอย่างtsched=0ดูwiki.archlinux.org/index.php/PulseAudio/ … )
rien333

หากคุณยังคงมีประสบการณ์การพูดติดอ่าง arch 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 tunneling แม้แต่โปรโตคอลการเชื่อมต่อโดยตรงก็ใช้งานได้ดี ตอนนี้ฉันเปลี่ยนไปใช้ฮาร์ดแวร์สตรีมมิ่งบลูทู ธ ธรรมดาซึ่งเชื่อถือได้และใช้ RPi สำหรับสิ่งอื่น ๆ
farindk

1

หากต้องการกำจัดปัญหาการพูดติดอ่างหรือหมดเวลาลองลดระดับ FW:

sudo rpi-update eeb2e51c3e08cd5efa4246aa8dc54a09b25ada12

1
คำเตือนระวังสิ่งที่rpi-updateใช้ในแบบนี้สามารถทำกับระบบของคุณ
earthmeLon

@earthmeLon อย่างน้อยคุณสามารถให้การอ้างอิงหรือพยายามแจ้งให้เราทราบว่าการใช้งานrpi-updateในรูปแบบนี้สามารถทำอะไรกับระบบของเรา ...
user11171

อย่าลืมอ่านคู่มือและทำการวิจัยเพื่อทำความเข้าใจว่าสิ่งนี้มีผลต่อระบบของคุณและอันตรายที่อาจเกิดขึ้นได้อย่างไร
earthmeLon

0

ฉันรับรู้ว่าปัญหานี้อาจเกี่ยวข้องกับเคอร์เนลเวอร์ชัน หลังจากอัปเกรดจาก 3.6.11 เป็น 3.12.0 ฉันได้รับ underruns เหล่านั้นอย่างต่อเนื่อง การปรับลดรุ่นกลับเป็น 3.6.11 ได้แก้ปัญหาให้ฉันแล้ว


0

ฉันได้อ่านหน้านี้สองสามครั้ง ... ฉันก็รู้สึกหงุดหงิดกับการรวมกันของเครือข่าย RaspberryPi-pulseaudio ฉันค้นหาอีกเล็กน้อยและพบหน้าเว็บที่ฉันพบส่วนหนึ่งของโซลูชัน:

=> ปิดการใช้งาน module-suspend-on-idle ใน default.pa (หรือ system.pa)

ดูเถิดการพูดติดอ่างได้หายไป!

ตอนนี้ปัญหาเดียวก็คือหลังจากผ่านไปครู่หนึ่ง (10 ถึง 20 วินาที) การเล่นค้าง: - /

ข้อเสนอแนะใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.