PulseAudio nói lắp


12

Tôi đã cài đặt raspbian trên Pi của mình và định cấu hình chậu PulseAudio với ý định truyền tất cả âm thanh từ máy tính để bàn sang Pi, điều khiển loa.

Tôi đã làm theo mô tả hay này: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=38&t=11124

Lúc đầu, điều này dường như làm việc mà không có vấn đề. Tuy nhiên, âm thanh được gửi từ máy tính để bàn liên tục bị vấp trên Pi, như thể có bộ đệm liên tục bị tràn chỉ với một vài mẫu bị thiếu ở giữa.

Tôi đã dành cả ngày cố gắng để tìm ra nguyên nhân, nhưng vô ích. Các thiết lập cơ bản là:

  • kết nối mạng LAN có dây
  • raspbian pi mới nhất (26 tháng 9 năm 2013) với các bản cập nhật firmware mới nhất
  • PulseAudio 2.0 ở cả hai bên (máy tính để bàn Ubuntu)
  • Phát lại thông qua mplayer, totem, ffplay
  • truyền mạng qua mô-đun-giao thức-tcp

Đây là những gì tôi đã cố gắng:

  • Phát âm thanh trực tiếp trên Pi hoạt động hoàn hảo.
  • Truyền phát đến các máy tính (máy tính để bàn) khác hoạt động tốt.
  • Gửi âm thanh với kết nối trực tiếp (chỉ định $ PULSE_SERVER) hoạt động khá tốt với rất ít nói lắp, nhưng vẫn dễ xảy ra sự cố-2 (xem bên dưới)
  • Gửi âm thanh qua đường hầm PulseAudio để bàn cho phép nói lắp liên tục
  • Tăng mức độ ưu tiên / lập lịch thời gian thực ... không giúp được gì
  • Sửa tốc độ lấy mẫu thành 48 kHz ... không giúp được gì
  • Đặt thuật toán lấy mẫu lại thành "tầm thường" ... không giúp được gì
  • Điều chỉnh các đoạn mặc định / kích thước mảnh ... không giúp được gì
  • Tôi không thể tìm thấy bất kỳ dấu hiệu nào của sự cố trong nhật ký PulseAudio (hiển thị từ khi tôi bắt đầu phát lại):

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

Vấn đề 2: như đã nói ở trên, tôi có thể nhận được âm thanh khá ok với kết nối trực tiếp. Tuy nhiên, sau một vài lần bỏ qua trong luồng (sử dụng mplayer), máy chủ PulseAudio bị treo và hoàn toàn không phát bất kỳ âm thanh nào. Đôi khi nó có thể được hồi sinh bằng cách khởi động lại mplayer. Đôi khi nó bị treo rất tệ đến mức PulseAudio phải được khởi động lại. Đôi khi nó bị treo khi tôi chỉ thay đổi mức âm lượng.

Theo tài liệu của PulseAudio, lợi thế của kết nối trực tiếp so với kết nối được điều chỉnh là có khả năng kiểm soát bộ đệm tốt hơn, điều này cho thấy lý do tại sao tôi có được âm thanh tốt với kết nối trực tiếp: http://www.freedesktop.org/wiki/Software / PulseAudio / Tài liệu / Người dùng / Mạng /

Tôi hết ý tưởng bây giờ. Điều gì có thể gây ra nói lắp và vấn đề 2? Chỉ cần một ý tưởng làm thế nào để tiến hành gỡ lỗi cũng sẽ được đánh giá cao.


Làm thế nào bạn chơi âm thanh trực tiếp? Tôi không có vấn đề gì với aplay, nhưng paplay nói lắp và tiếng vang khủng khiếp.
John La Rooy

Tôi đã sử dụng mplayer, totem, madplay, ... Nhưng thực tế là những người chơi khác nhau cư xử khác nhau ủng hộ tôi đoán rằng đó có vẻ là một vấn đề phần mềm với bộ đệm dữ liệu. Một số người chơi đẩy nhiều dữ liệu trước thời gian thực hơn những người khác.
farindk

Tôi gặp khó khăn khi chỉ chơi sóng hình sin . Tôi nghĩ rằng tôi sẽ cần phải giải quyết điều đó trước khi tôi có thể thử phát trực tuyến qua mạng LAN.
John La Rooy

Câu trả lời:


6

tsched_buffer_sizetsched_buffer_watermarklà các thiết lập làm cho nó hoạt động với tôi.

Tôi chạy PulseAudio của tôi như là một phiên bản hệ thống, vì vậy cấu hình nằm trong /etc/pulse/system.pa. Nếu bạn đang sử dụng một phiên bản thay thế, thì cấu hình sẽ ở trong /etc/pulse/default.pa.

Đây là mặc định:

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

Tôi đã thay thế nó bằng cái này: (nghĩa là đã nhận xét nó)

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

Sau đó, tôi đã thêm dòng sau:

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

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


Điểm tốt. Tôi đã cố gắng, nhưng nó không giúp được gì. Ngay cả với kích thước bộ đệm lớn hơn nhiều. Gửi âm thanh qua kết nối trực tiếp bằng cách đặt PULSE_SERVER cho Pi sẽ cho âm thanh rõ ràng, nhưng chỉ cần thay đổi âm lượng cuối cùng sẽ đóng băng kết nối. Âm thanh thông qua đường hầm vẫn cho nói lắp. Tôi đoán rằng đây thực sự là một vấn đề của PulseAudio, vì với kích thước bộ đệm lớn đó (tôi đã sử dụng 4 MB), người ta sẽ thấy rằng âm thanh được giải mã theo cách trước khi bắt đầu một tệp. Nhưng nó không phải như vậy. Vì vậy, phải có một cái gì đó làm chậm việc nạp tiền.
trò hề

Chạy vào cùng một loại vấn đề. Trong trường hợp cụ thể của tôi, PULSE_SERVER + mplayer hoạt động như một bùa mê, trong khi PULSE_SERVER + clementine (mà tôi tin là đang sử dụng guxer) rất tệ. Bất cứ ý tưởng khác nhau giữa hai?
Jonathan Protzenko

@Protzenko: Tôi đoán mà không cần nhìn vào bất kỳ nguồn nào là mplayer có thể đẩy dữ liệu cho đến khi PulseAudio bị chặn, trong khi đó, người truyền tin có thể gửi dữ liệu được theo dõi bởi một tham chiếu thời gian thực. Điều đó có nghĩa là bộ đệm được lấp đầy hơn nhiều trong trường hợp trước, và do đó, có độ trễ lớn hơn.
farindk

Tôi đang gặp vấn đề tương tự PULSE_SERVER + ffmpeg tốt, PULSE_SERVER + mpd cửa chớp và ẩn ngầm
Reimundo Heluani

3

Điểm chính là bạn phải sử dụng module-tunnel-sink-new, nhưng bạn cũng phải thực hiện một vài thay đổi khác để có được âm thanh mạng không bị nhiễu trên raspberry pi 1.

  1. Chạy pulseaudio trên pi mâm xôi với ưu tiên thời gian thực:
pulseaudio --start --high-priority=yes --realtime=yes

Hãy để chúng tôi sử dụng thuật ngữ người gửi để biểu thị máy tính gửi luồng đến pi mâm xôi của bạn.

  1. Đặt default-fragmentsdefault-fragment-size-msectrong daemon.conflúc gửi đến các giá trị:
default-fragments = 8
default-fragment-size-msec = 12
  1. Sử dụng module-tunnel-sink-newbằng cách ban hành lệnh này tại người gửi (giả sử tên máy chủ của raspberry pi của bạn là RP1 và bạn có mDNS hoạt động trên mạng cục bộ của mình. Nếu không, chỉ cần sử dụng địa chỉ IP của pi mâm xôi của bạn).
pactl load-module module-tunnel-sink-new server=RP1.local

Với các cài đặt này, tôi nhận được âm thanh không bị nhiễu từ raspberrypi 1 qua mạng không dây hoạt động ở tốc độ 54 Mb / giây (Trong thiết lập của tôi, người gửi sử dụng ethernet và RP1 đang sử dụng wlan). Trên thực tế, nó hoạt động ngay cả khi cả hai người gửi và raspberrypi đang sử dụng wlan, ít nhất là nếu không có thiết bị nào khác trên mạng không dây.


Hoạt động tuyệt vời cho đến nay. Tôi đã thấy rằng đối với Pi3 của tôi (với một phần mềm / debian mới hơn một chút) tôi đã phải thay đổi một cái gì đó khác để cài đặt "các đoạn mặc định" được chọn. (cụ thể là cài đặt thứ gì đó tsched=0, xem wiki.archlinux.org/index.php/PulseAudio/ mẹo )
rien333

Nếu bạn vẫn gặp phải tình trạng nói lắp, wiki vòm cũng khuyên bạn nên thay đổi giao thức phát trực tuyến rtp
rien333

1

bạn đã kiểm tra trang này chưa:

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

THIẾT BỊ 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).

Vâng, đã thử điều đó, nhưng nó không giúp được gì. Như tôi đã đề cập, phát lại âm thanh trên thiết bị hoạt động tốt. Tôi cho rằng đây là sự cố giao thức mạng với đường hầm PulseAudio. Ngay cả giao thức kết nối trực tiếp hoạt động tốt. Bây giờ tôi đã chuyển sang một phần cứng phát trực tiếp Bluetooth đơn giản, đáng tin cậy và sử dụng RPi cho những thứ khác.
farindk

1

Để thoát khỏi các vấn đề nói lắp hoặc hết thời gian, hãy thử hạ cấp FW:

sudo rpi-update eeb2e51c3e08cd5efa4246aa8dc54a09b25ada12

1
CẢNH BÁO Hãy nhận biết những gì rpi-updatesử dụng trong thời trang này có thể làm cho hệ thống của bạn.
earthmeLon

@earthmeLon ít nhất bạn có thể đưa ra một tài liệu tham khảo hoặc cố gắng thông báo cho chúng tôi những gì sử dụng rpi-updatetrong thời trang này có thể làm gì cho các hệ thống của chúng tôi ...
user11171

Hãy chắc chắn đọc Hướng dẫn và thực hiện một số nghiên cứu để hiểu điều này ảnh hưởng đến hệ thống của bạn và bất kỳ nguy hiểm tiềm ẩn nào.
earthmeLon

0

Tôi nhận ra rằng vấn đề này có thể liên quan đến phiên bản kernel. Sau khi nâng cấp từ 3.6.11 lên 3.12.0, tôi liên tục nhận được những lỗi đó. Việc hạ cấp trở lại 3.6.11 đã giải quyết vấn đề cho tôi.


0

Tôi đã đọc trang này một vài lần ... Tôi cũng cảm thấy thất vọng với sự kết hợp của RaspberryPi-pulseaudio-mạng. Tôi đã tìm kiếm thêm một chút và tìm thấy một trang nơi tôi tìm thấy một phần của giải pháp:

=> Vô hiệu hóa mô-đun đình chỉ-không hoạt động trong mặc định.pa (hoặc system.pa).

Kìa, sự nói lắp đã biến mất!

Bây giờ vấn đề duy nhất là sau một thời gian (10 đến 20 giây), quá trình phát lại bị treo: - /

Bất kỳ đề xuất?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.