pulseaudio 播放卡顿的解决方法

分析

  1. save sink 数据确认是 pulseaudio的卡顿 (下面脚本是录制 pulseaudio 给 alsa 的sink流数据)
    PCM="$1"
    if [ -z "$WAV" ]; then
        echo "Usage: $0 OUTPUT.PCM" >&2
        exit 1
    fi
    rm -f "$PCM"
    # Get sink monitor:
    MONITOR=$(pactl list | egrep -A2 '^(\*\*\* )?Source #' | \
        grep 'Name: .*\.monitor$' | awk '{print $NF}' | tail -n1)
    echo "set-source-mute ${MONITOR} false" | pacmd >/dev/null
    # Record it raw, and convert to a pcm rate data
    echo "Recording to $WAV ..."
    echo "Close this window to stop"
    #parec -d "$MONITOR" | flac --endian=little --sign=signed --channels=2 --bps=16n --sample-rate=44100 -o "$WAV"
    parec -d "$MONITOR" --format=s16le --channels=2 >> "$PCM"

    将录制的数据在pc上播放确认是不是 pulseaudio 的播放卡顿

  2. pactl list sinks
Sink #0
State: RUNNING
Name: alsa_output.0.analog-stereo
Description: HISI-AIAO Analog Stereo
Driver: module-alsa-sink.c
Sample Specification: s16le 2ch 48000Hz
Channel Map: front-left,front-right
Owner Module: 1
Mute: no
Volume: front-left: 65536 / 100% / 0.00 dB,   front-right: 65536 / 100% / 0.00 dB
        balance 0.00 
Base Volume: 65536 / 100% / 0.00 dB
Monitor Source: alsa_output.0.analog-stereo.monitor
Latency: 120458 usec, configured 105000 usec
Flags: HARDWARE DECIBEL_VOLUME LATENCY 
Properties:
alsa.resolution_bits = "16"
device.api = "alsa"
device.class = "sound"
alsa.class = "generic"
alsa.subclass = "generic-mix"
alsa.name = ""
alsa.id = "Playback aiao-hifi-0"
alsa.subdevice = "0"
alsa.subdevice_name = "subdevice #0"
alsa.device = "0"
alsa.card = "0"
alsa.card_name = "HISI-AIAO"
alsa.long_card_name = "HISI-AIAO"
device.string = "hw:0"
device.buffering.buffer_size = "65536"
device.buffering.fragment_size = "8192"
device.access_mode = "mmap+timer"
device.profile.name = "analog-stereo"
device.profile.description = "Analog Stereo"
device.description = "HISI-AIAO Analog Stereo"
device.icon_name = "audio-card-analog"
Formats: pcm

如上:我们的 alsa 的缓冲区的大小是 65536,片段大小是 8196,因此片段数是65536/8196 = 8; 音频数据格式是 48000 ,16 位,2通道, 1s的数据是 48000162 = 1536000;8196/1536000=0.005s 即就是5ms,然后在我们的 /etc/pulse/daemon.conf 里默认的 default-fragments = 4 ,default-fragment-size-msec = 25,这就需要缓冲区缓冲 100ms的数据,但是我们的alsa 缓冲区可缓冲65536/1536000 = 0.042 即 42ms的数据;猜测在某些cpu 调度的情况下 pulseaudio 与 alsa 读写不协调引起播放卡顿

解决方案

要修改 /etc/pulse/daemon.conf 中 default-fragments = 8,default-fragment-size-msec =42/8~=5
/etc/pulse/default.pa 添加 load-module module-udev-detect tsched=0

注:pulseaudio 学习

pulseaudio故障排除 https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting
(注 Arch Linux:这个网站可以先mark,有很多别的知识,比如 蓝牙,wifi,网络,蓝牙耳机, pulseaudio 如何配置蓝牙耳机等,可以学习)

pulseaudio 的代码框架,模块,基础组件等的介绍,可以对 pulseaudio 的服务端和客户端源代码有个系统的认知 https://gavv.github.io/articles/pulseaudio-under-the-hood/#about-pulseaudio

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值