PulseAudio 싱크 끊김


12

Pi에 raspbian을 설치하고 데스크톱에서 Pi로 모든 오디오를 스트리밍하여 스피커를 구동 할 수 있도록 PulseAudio 싱크를 구성했습니다.

나는이 멋진 설명을 따랐다 : http://www.raspberrypi.org/phpBB3/viewtopic.php?f=38&t=11124

처음에는 이것이 문제없이 작동하는 것처럼 보였습니다. 그러나 데스크톱에서 전송 된 오디오는 파이에서 계속 끊김 현상이 발생합니다. 중간에 샘플이 몇 개만 있으면 버퍼 언더런이 일정하게 유지되는 것처럼 보입니다.

나는 하루 종일 원인을 찾으려고 노력했지만 아무 소용이 없습니다. 기본 설정은 다음과 같습니다.

  • 유선 LAN 연결
  • 최신 펌웨어 업데이트가있는 최신 라즈 비안 파이 (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의 원인은 무엇입니까? 디버깅을 진행하는 방법에 대한 아이디어도 높이 평가할 것입니다.


오디오를 어떻게 직접 연주 했습니까? 나는 놀이에 아무런 문제가 없었지만, paplay는 말더듬하고 울려 퍼진다.
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로 설정하여 직접 연결을 통해 오디오를 보내면 깨끗한 오디오가 제공되지만 볼륨을 변경하면 결국 연결이 고정됩니다. 터널링을 통한 오디오는 여전히 말더듬을 제공합니다. 내 버퍼는 큰 버퍼 크기 (4MB 사용)로 인해 파일 시작 부분에서 오디오가 미리 디코딩되는 것을 볼 수 있기 때문에 이것이 실제로 PulseAudio 문제라고 생각합니다. 그러나 그렇지 않습니다. 따라서 리필 속도를 늦추는 것이 있어야합니다.
farindk

같은 종류의 문제가 발생합니다. 필자의 경우 PULSE_SERVER + mplayer는 매력처럼 작동하지만 PULSE_SERVER + clementine (gstreamer를 사용한다고 생각합니다)은 끔찍합니다. 둘 사이의 차이점이 무엇입니까?
Jonathan Protzenko

@ Protzenko : 소스를 보지 않고도 mplayer는 PulseAudio가 차단 될 때까지 데이터를 푸시 할 수 있지만 gstreamer는 실시간 참조로 클럭 된 데이터를 보낼 수 있습니다. 이는 전자의 경우 버퍼가 훨씬 더 많이 채워 져서 더 큰 지연이 있음을 의미합니다.
farindk

저도 같은 문제 PULSE_SERVER +는 FFmpeg 좋은, PULSE_SERVER + MPD 셔터 및 암시 언더런보고 있어요
Reimundo Heluani

3

요점은을 사용해야 module-tunnel-sink-new하지만, 라즈베리 파이 1에서 끊김없는 네트워크 오디오를 얻으려면 몇 가지 다른 사항도 변경해야합니다.

  1. 실시간 우선 순위로 raspberry pi에서 pulseaudio를 실행하십시오.
pulseaudio --start --high-priority=yes --realtime=yes

sender 라는 용어를 사용하여 스트림을 라즈베리 파이로 보내는 컴퓨터를 나타냅니다.

  1. 설정 default-fragmentsdefault-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

이 설정을 사용하면 54Mbps로 작동하는 무선 네트워크를 통해 raspberrypi 1에서 끊김없는 오디오를 얻습니다 (설정에서 발신자 는 이더넷을 사용하고 RP1은 무선 랜을 사용합니다). 실제로 는 적어도 무선 네트워크에 다른 장치가없는 경우 발신자 와 raspberrypi가 모두 무선 랜을 사용하는 경우에도 작동 합니다.


지금까지 잘 작동합니다. Pi3 (좀 더 새로운 데비안 / 소프트웨어 포함)의 경우 "기본 조각"설정을 선택하기 위해 다른 것을 변경해야한다는 것을 알았습니다. (즉, 무언가 설정 tsched=0wiki.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를 사용하는 간단한 Bluetooth 스트리밍 하드웨어로 전환했습니다.
farindk

1

말더듬 또는 시간 초과 문제를 해결하려면 FW 다운 그레이드를 시도하십시오.

sudo rpi-update eeb2e51c3e08cd5efa4246aa8dc54a09b25ada12

1
경고는 무엇을 알고 있어야 rpi-update시스템에 할 수있는이 방식으로 사용합니다.
earthmeLon

@earthmeLon 당신은 적어도 rpi-update이런 식으로 사용 하는 것이 우리 시스템에 어떤 영향을 줄 수 있는지 알려주거나 참조 할 수 있습니다.
user11171

설명서를 반드시 읽고 시스템에 미치는 영향과 잠재적 위험에 대해 알아보십시오.
earthmeLon

0

이 문제는 커널 버전과 관련이있을 수 있음을 알고 있습니다. 3.6.11에서 3.12.0으로 업그레이드 한 후 계속해서 이러한 언더런이 발생했습니다. 3.6.11로 다시 다운 그레이드하면 문제가 해결되었습니다.


0

이 페이지를 몇 번 읽었습니다 ... 또한 RaspberryPi-pulseaudio-network 조합의 말더듬에 좌절했습니다. 조금 더 검색 하고 솔루션의 일부를 찾은 페이지 를 찾았습니다.

=> default.pa (또는 system.pa)에서 모듈 일시 중단 유휴를 비활성화합니다.

보라, 말더듬이 사라졌습니다!

이제 유일한 문제는 잠시 후 (10-20 초) 재생이 중단된다는 것입니다.

어떤 제안?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.