在 Waydroid 容器内提升 Android 音量
在 Waydroid 容器内提升 Android 音量
# 进入 Waydroid shell
sudo waydroid shell
# 在容器内用 Android 命令提升媒体音量
cmd media_session volume --set 15 # 最大通常是 15 或 16
# 或者
service call audio 3 i32 3 i32 15 # 3=STREAM_MUSIC, 15=音量值
快速诊断脚本
运行下面这个脚本,可以一次性确认问题根源:
echo "=== 默认音频 Sink ==="
pactl info | grep "默认音频入口"
echo ""
echo "=== 蓝牙设备 Profile ==="
pactl list cards | grep -A 5 "Name: bluez_card"
echo ""
echo "=== 当前 Sink Inputs(是否有 Waydroid)==="
pactl list sink-inputs | grep -E "(Name:|application.name)"
echo ""
echo "=== ALSA 设备 ==="
aplay -l | head -10
第一步:查看当前的 PulseAudio 路径配置
# 1. 安装 pavucontrol(PulseAudio 音量控制 GUI)
sudo apt install pavucontrol
# 2. 运行 Waydroid 并播放声音,然后打开 pavucontrol
pavucontrol
-----------------------------------
cat /var/lib/waydroid/waydroid.prop | grep pulse_runtime_path
waydroid.pulse_runtime_path=/run/xdg/pulse
------------------------------------
pactl info
服务器字串:/run/user/1000/pulse/native
程序库协议版本:35
服务器协议版本:35
是否本地服务器:是
客户端索引:36
区块大小: 65472
用户名:bob
主机名:bob-FMVU26011
服务器名:pulseaudio
服务器版本:15.99.1
默认采样规格:s16le 2ch 44100Hz
默认声道映射:front-left,front-right
默认音频入口:alsa_output.pci-0000_00_1f.3.analog-stereo
默认信源: alsa_input.pci-0000_00_1f.3.analog-stereo
Cookie:097f:bb45
# 查看 PulseAudio 使用的底层 ALSA 声卡
pactl list sinks | grep -A 5 "Name:\|alsa\|Driver"
# 在输出中找 Driver: 行:
# module-alsa-card.c → 直接驱动 ALSA 声卡
# module-bluez5-device.c → 蓝牙设备
# module-pipe-sink.c → PipeWire 或管道输出
pactl list sinks
#查看已加载的 PulseAudio 模块
pactl list modules short
如果输出是 /run/xdg/pulse,而你的 PulseAudio 实际运行在 /run/user/1000/pulse,这就是路径不匹配——Waydroid 容器内的音频 HAL 找不到 PulseAudio socket,于是回退到直接 ALSA 硬件输出,导致 pavucontrol 看不到 Waydroid 的音频流。
第二步:修正 PulseAudio 路径
# 1. 停止 Waydroid
waydroid session stop
sudo systemctl stop waydroid-container
# 2. 直接编辑配置文件,修正 pulse_runtime_path
sudo sed -i 's|waydroid.pulse_runtime_path=/run/xdg/pulse|waydroid.pulse_runtime_path=/run/user/1000/pulse|' /var/lib/waydroid/waydroid.prop
# 3. 确认修改成功
grep pulse_runtime_path /var/lib/waydroid/waydroid.prop
如果
waydroid.prop里没有pulse_runtime_path这一行,直接追加:bash复制
echo "waydroid.pulse_runtime_path=/run/user/1000/pulse" | sudo tee -a /var/lib/waydroid/waydroid.prop
第三步:确保容器内有 ALSA PulseAudio 插件
即使路径正确,如果 Waydroid 容器内的 ALSA 配置没有定义 pulse PCM 设备,snd_pcm_open("pulse", ...) 仍然会失败。
bash复制
# 检查容器内是否有 ALSA 的 pulse PCM 配置
sudo ls /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/ 2>/dev/null || echo "目录不存在"
如果目录为空或不存在,需要创建配置:
sudo mkdir -p /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/
cat << 'EOF' | sudo tee /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/99-pulse.conf
pcm.pulse {
type pulse
hint {
show on
description "PulseAudio PCM"
}
}
ctl.pulse {
type pulse
hint {
show on
description "PulseAudio Control"
}
}
pcm.!default {
type pulse
hint {
show on
description "Default PulseAudio Output"
}
}
ctl.!default {
type pulse
hint {
show on
description "Default PulseAudio Control"
}
}
EOF
第四步:确保 PulseAudio socket 对容器可见
Waydroid 容器需要访问宿主机的 PulseAudio socket:
# 确认 socket 存在
ls -la /run/user/1000/pulse/native
# 确认权限(应该对当前用户可读)
ls -la /run/user/1000/pulse/
如果 socket 不存在,重启 PulseAudio:
pulseaudio -k
pulseaudio --start
第五步:启动容器服务和 Waydroid
# 启动容器服务
sudo systemctl start waydroid-container
# 启动 Waydroid 会话
waydroid session start
然后在 Waydroid 中播放音频,同时在宿主机运行:
pactl list sink-inputs | grep -E "(Input|application.name)"
如果看到类似 application.name = "AudioFlinger" 或 application.name = "Waydroid" 的条目,说明音频已经正确路由到 PulseAudio 了。
第六步:提升音量
一旦 Waydroid 的音频流出现在 PulseAudio 中,就可以:
# 用 pavucontrol 把 Waydroid 的音量拉到 150%
pavucontrol
或者在命令行:
# 找到 Waydroid 的 sink input ID,然后提升音量
pactl list sink-inputs
pactl set-sink-input-volume <WAYDROID_INPUT_ID> 150%
快速修复脚本
如果你不想一步步操作,可以直接运行这个脚本:
#!/bin/bash
set -e
echo "=== 停止 Waydroid ==="
waydroid session stop 2>/dev/null || true
sudo systemctl stop waydroid-container 2>/dev/null || true
echo "=== 修正 PulseAudio 路径 ==="
sudo sed -i 's|waydroid.pulse_runtime_path=/run/xdg/pulse|waydroid.pulse_runtime_path=/run/user/1000/pulse|' /var/lib/waydroid/waydroid.prop
grep -q "waydroid.pulse_runtime_path" /var/lib/waydroid/waydroid.prop || \
echo "waydroid.pulse_runtime_path=/run/user/1000/pulse" | sudo tee -a /var/lib/waydroid/waydroid.prop
echo "=== 创建 ALSA PulseAudio 配置 ==="
sudo mkdir -p /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/
cat << 'EOF' | sudo tee /var/lib/waydroid/rootfs/vendor/usr/share/alsa/alsa.conf.d/99-pulse.conf
pcm.pulse {
type pulse
hint {
show on
description "PulseAudio PCM"
}
}
ctl.pulse {
type pulse
hint {
show on
description "PulseAudio Control"
}
}
pcm.!default {
type pulse
hint {
show on
description "Default PulseAudio Output"
}
}
ctl.!default {
type pulse
hint {
show on
description "Default PulseAudio Control"
}
}
EOF
echo "=== 启动 Waydroid ==="
sudo systemctl start waydroid-container
waydroid session start &
echo "=== 等待 Waydroid 启动 ==="
sleep 5
echo "=== 检查 Sink Inputs ==="
pactl list sink-inputs | grep -E "(Input|application.name)" || echo "暂无 Waydroid 音频流"
echo ""
echo "修复完成。请在 Waydroid 中播放音频,然后运行: pactl list sink-inputs"
核心问题总结
| 问题 | 原因 |
|---|---|
waydroid prop 提示 stopped |
容器服务 waydroid-container 未运行,prop 需要容器服务才能通信 |
| pavucontrol 看不到 Waydroid | Waydroid 的 pulse_runtime_path 指向了错误路径(/run/xdg/pulse 而非 /run/user/1000/pulse),或容器内缺少 ALSA pulse PCM 配置 |
| 声音小 | 音频直接走了 ALSA → 蓝牙 HFP,绕过 PulseAudio,无法通过 pavucontrol 超放大 |
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
微信
支付宝