问题现象

Waydroid 安装、网络和应用兼容问题处理完成后,Android 应用已经能够正常打开,视频和音乐也可以播放。

最初观察时,容易误以为 Waydroid 完全没有声音。进一步确认后发现,声音实际上存在,只是音量非常小。

宿主机本身的音频输出正常,其他 Linux 应用音量也没有异常。因此,问题并不在 PipeWire、PulseAudio、扬声器或宿主机输出设备,而在 Waydroid 内部的 Android 媒体音量。

最终检查发现,Android 的媒体音量只有:

5 / 15

也就是大约三分之一。

将其调整为:

15 / 15

之后,Waydroid 内应用音量恢复正常。


Waydroid 中存在两层音量控制

Waydroid 的声音至少涉及两层控制:

  1. Android 容器内部的媒体音量
  2. 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 命令。

Leave a Reply

Your email address will not be published. Required fields are marked *