问题现象
Waydroid 安装、网络和应用兼容问题处理完成后,Android 应用已经能够正常打开,视频和音乐也可以播放。
最初观察时,容易误以为 Waydroid 完全没有声音。进一步确认后发现,声音实际上存在,只是音量非常小。
宿主机本身的音频输出正常,其他 Linux 应用音量也没有异常。因此,问题并不在 PipeWire、PulseAudio、扬声器或宿主机输出设备,而在 Waydroid 内部的 Android 媒体音量。
最终检查发现,Android 的媒体音量只有:
5 / 15
也就是大约三分之一。
将其调整为:
15 / 15
之后,Waydroid 内应用音量恢复正常。
Waydroid 中存在两层音量控制
Waydroid 的声音至少涉及两层控制:
- Android 容器内部的媒体音量
- Linux 宿主机的应用音量和总输出音量
如果 Android 内部媒体音量只有 30%,即使宿主机已经设置为 100%,最终听到的声音仍然可能很小。
因此,一种比较稳定的使用方式是:
- 将 Waydroid 内部媒体音量固定为 100%
- 日常只通过宿主机调节整体音量
这样可以避免 Android 内部音量和 Linux 宿主机音量同时缩小,导致实际输出过低。
为什么键盘音量键可能无效
在普通 Android 手机或平板上,按音量加键通常可以直接调整媒体音量。
但在 Waydroid 独立窗口模式下,键盘上的音量键不一定会正确传递给 Android 容器。
即使 Waydroid 窗口已经获得焦点,也可能出现以下情况:
- 音量键被 KDE 或桌面环境截获
- 音量键只调整宿主机音量
- Waydroid 没有收到 Android 的音量按键事件
- 键盘本身没有独立的多媒体按键
这种情况下,直接通过命令行调整 Android 内部音量更加可靠。
错误尝试一:直接执行 media volume
最初尝试使用:
sudo waydroid shell media volume --stream 3 --set 15
结果 Waydroid 提示:
waydroid: error: unrecognized arguments: --stream 3 --set 15
这是因为 waydroid shell 后面的 --stream 被 Waydroid 自身的参数解析器处理了,没有正确传递到 Android 容器。
于是增加参数分隔符:
sudo waydroid shell -- media volume --stream 3 --set 15
但随后又出现:
Failed to exec "media"
这说明当前 Android 镜像中并不存在名为 media 的独立可执行文件。
因此,问题不仅是缺少参数分隔符,命令本身的入口也不适用于当前镜像。
正确方法:使用 cmd media_session
Android 系统服务可以通过 /system/bin/cmd 调用。
控制媒体音量时,应使用:
cmd media_session volume
其中:
stream 3
对应 Android 的:
STREAM_MUSIC
也就是视频、音乐、游戏和大多数应用使用的媒体音量。
查看当前媒体音量
执行:
sudo waydroid shell -- \
/system/bin/cmd media_session volume \
--stream 3 --get
实际输出类似:
[V] will control stream=3 (STREAM_MUSIC)
[V] will get volume
[V] Connecting to AudioService
[V] volume is 5 in range [0..15]
其中最重要的一行是:
volume is 5 in range [0..15]
这表示:
- 当前媒体音量:5
- 最大媒体音量:15
- 实际比例:约 33%
这也解释了为什么 Waydroid 有声音,但听起来明显偏小。
将媒体音量设置为 100%
执行:
sudo waydroid shell -- \
/system/bin/cmd media_session volume \
--show --stream 3 --set 15
输出类似:
[V] will control stream=3 (STREAM_MUSIC)
[V] will set volume to index=15
[V] Connecting to AudioService
这里的:
--set 15
表示将媒体音量设置为最大值。
--show 会尝试触发 Android 的音量显示界面,但在 Waydroid 中不一定能看到明显的屏幕提示,不影响设置结果。
验证设置结果
再次执行:
sudo waydroid shell -- \
/system/bin/cmd media_session volume \
--stream 3 --get
如果设置成功,会看到:
[V] volume is 15 in range [0..15]
这表示 Waydroid 内部媒体音量已经达到:
15 / 15
也就是 100%。
最终使用策略
修复完成后,可以将 Waydroid 内部媒体音量长期保持为最大值:
15 / 15
之后不再频繁调整 Android 内部音量,而是只使用宿主机的音量控制。
这样做有几个优点:
- 避免 Android 和宿主机两层音量同时降低
- 减少“有声音但声音很小”的误判
- 宿主机音量控制更加方便
- 不需要依赖 Waydroid 窗口是否正确接收音量键
- 应用之间的音量表现更统一
需要注意的是,如果某个 Android 应用本身还有独立音量设置,仍应检查应用播放器内部是否被静音或单独调低。
可直接保存的命令
查看 Waydroid 媒体音量:
sudo waydroid shell -- \
/system/bin/cmd media_session volume \
--stream 3 --get
设置媒体音量为最大值:
sudo waydroid shell -- \
/system/bin/cmd media_session volume \
--show --stream 3 --set 15
设置后再次验证:
sudo waydroid shell -- \
/system/bin/cmd media_session volume \
--stream 3 --get
总结
Waydroid 中出现“应用有声音,但音量很小”时,不一定是 Linux 音频服务、PipeWire 或容器音频桥接出现故障。
如果声音可以正常播放,只是响度偏低,首先应检查 Android 内部的 STREAM_MUSIC 音量。
本次问题的实际原因是:
Android 媒体音量只有 5/15
通过 cmd media_session volume 将其调整为:
15/15
问题随即解决。
正确命令的关键点有两个:
waydroid shell --
用于将后续参数传递到容器内部;
以及:
/system/bin/cmd media_session volume
用于调用 Android 的媒体会话服务,而不是执行当前镜像中不存在的 media 命令。