一、问题说明
设备环境:
LineageOS 21 Android 14 x86_64 TV系统能够正常通过 HDMI 输出画面,但 YouTube、系统提示音和本地播放器都没有声音。
参考项目:
AndroidTV x86 HDMI Audio Fix https://github.com/RealMartinKevin/androidtv-x86-hdmi-audio-fix该项目可以帮助检测实际可用的 HDMI ALSA 设备,但它原本通过修改/system/etc/init.sh实现永久修复。LineageOS 21 的系统分区默认受保护,原脚本可能出现Read-only file system。
最终处理思路:
- 检查 HDMI 声卡和 PCM 设备;
- 通过 ELD 确认电视已经被系统识别;
- 使用
alsa_aplay验证底层 HDMI 音频正常; - 检查 Android Audio Policy 状态;
- 修改
hdmi_audio_policy_configuration.xml; - 将
HDMI_2设置为固定连接设备和默认输出。
二、准备工作
需要准备:
- 已安装 LineageOS 21 x86_64 TV 的设备;
- Windows 电脑和 ADB 工具;
- 已开启 USB 调试;
- 一个标准 PCM WAV 测试音频;
- 系统支持
adb root。
确认连接:
adb devices adb root adb wait-for-device adb shell id正常应看到:
uid=0(root) gid=0(root)这表示 ADB Shell 已经是 root,不需要再执行su。
三、检查 ALSA 工具
adb shell which alsa_aplay adb shell which alsa_amixer正常输出:
/system/bin/alsa_aplay /system/bin/alsa_amixer四、推送测试音频
建议使用双声道、16 bit、48000 Hz 的 PCM WAV 文件。
adb push sample.wav /data/local/tmp/sample.wav adb shell ls -l /data/local/tmp/sample.wav五、查看声卡
adb shell cat /proc/asound/cards我的设备输出:
0 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xdf120000 irq 130这里只显示一张HDA Intel PCH,并不代表没有 HDMI 音频。Intel 平台上的 HDMI 音频通常作为同一张 HDA 声卡下面的 PCM 设备存在。
六、查看 HDMI PCM 设备
adb shell cat /proc/asound/pcm我的设备中可以看到:
00-03: HDMI 0 : HDMI 0 : playback 1 00-07: HDMI 1 : HDMI 1 : playback 1 00-08: HDMI 2 : HDMI 2 : playback 1对应 ALSA 设备:
plughw:0,3 plughw:0,7 plughw:0,8第一个数字是声卡号,第二个数字是 PCM 设备号。
七、查看 ELD,确认电视已经连接
ELD 是 HDMI 显示设备向系统上报的音频能力信息。
先列出 ELD 文件:
adb shell ls -l /proc/asound/card0/eld*一次性读取全部 ELD:
adb shell "for f in /proc/asound/card0/eld#2.*; do echo ==== $f; cat $f; done"找到包含以下内容的项目:
monitor_present 1 eld_valid 1 monitor_name Mi TV connection_type HDMI我的设备对应/proc/asound/card0/eld#2.0,关键内容如下:
monitor_present 1 eld_valid 1 monitor_name Mi TV connection_type HDMI speakers [0x1] FL/FR sad0_coding_type [0x1] LPCM sad0_channels 2 sad0_rates [0xe0] 32000 44100 48000 sad0_bits [0xe] 16 20 24这说明 HDMI 线、电视握手、Intel HDMI 音频驱动和电视的 LPCM 支持都正常。
八、检查 DRM HDMI 接口
adb shell ls -1 /sys/class/drm我的设备输出:
card1 card1-DP-1 card1-HDMI-A-1 renderD128 version查看连接状态:
adb shell cat /sys/class/drm/card1-HDMI-A-1/status正常应返回:
connected不知道具体接口名称时,可以执行:
adb shell "for f in /sys/class/drm/*/status; do echo ==== $f; cat $f; done"九、打开 IEC958
adb shell "for ch in 0 1 2 3; do alsa_amixer -c0 set IEC958,$ch on; done"部分通道提示不存在可以忽略。
十、手动测试 HDMI 设备
依次测试:
adb shell alsa_aplay -Dplughw:0,3 /data/local/tmp/sample.wav adb shell alsa_aplay -Dplughw:0,7 /data/local/tmp/sample.wav adb shell alsa_aplay -Dplughw:0,8 /data/local/tmp/sample.wav我的设备执行下面这条就能正常出声:
adb shell alsa_aplay -Dplughw:0,3 /data/local/tmp/sample.wav最终确认:
声卡号:0 设备号:3 ALSA 设备:plughw:0,3如果alsa_aplay能响,说明 HDMI 硬件、驱动和 ALSA 层都正常,问题位于 Android Audio Policy。
出现权限错误时先执行:
adb root十一、检查 Android Audio Policy
adb shell dumpsys media.audio_policy > audio_before.txt findstr /n /i "Available output devices Outputs HDMI_2 Selected Device" audio_before.txt修改前,系统虽然能看到:
HDMI_2 AUDIO_DEVICE_OUT_HDMI hdmi_stereo hdmi_multi但HDMI_2只出现在Declared devices和Supported devices中。
真正可用的输出仍然只有:
Available output devices (2): Speaker Telephony Tx媒体流始终选择:
Selected Device: AUDIO_DEVICE_OUT_SPEAKER这说明 HDMI 配置模块已经加载,但HDMI_2没有被标记为可用输出。
十二、将根目录重新挂载为可写
先查看根目录挂载状态:
adb shell mount | findstr " on / "我的系统最初是:
/dev/loop0 on / type ext4 (ro,seclabel,relatime)重新挂载为可写:
adb root adb shell mount -o remount,rw /再次检查,成功后会显示:
/dev/loop0 on / type ext4 (rw,seclabel,relatime)可以测试写入:
adb shell touch /system/test_rw adb shell ls -l /system/test_rw adb shell rm /system/test_rw不要使用adb remount,部分 Android-x86 系统会提示 overlayfs 不受支持。也不要执行mount -o remount,rw /system,因为/system不是独立挂载点,真正的挂载点是/。
十三、找到 HDMI 配置文件
adb shell "grep -R -l 'HDMI_2' /vendor/etc /system/etc 2>/dev/null"我的设备返回:
/vendor/etc/hdmi_audio_policy_configuration.xml十四、拉取配置文件
adb pull /vendor/etc/hdmi_audio_policy_configuration.xml . copy hdmi_audio_policy_configuration.xml hdmi_audio_policy_configuration.xml.original建议使用 Notepad++ 或 Visual Studio Code 编辑,保持 UTF-8 和 Unix 换行格式。
十五、修改 HDMI Audio Policy
找到:
<modulename="hdmi"halVersion="2.0">在<mixPorts>前面加入:
<attachedDevices><item>HDMI_2</item></attachedDevices><defaultOutputDevice>HDMI_2</defaultOutputDevice>修改后的结构:
<modulename="hdmi"halVersion="2.0"><attachedDevices><item>HDMI_2</item></attachedDevices><defaultOutputDevice>HDMI_2</defaultOutputDevice><mixPorts>...</mixPorts><devicePorts>...</devicePorts><routes>...</routes></module>attachedDevices会让HDMI_2作为固定连接设备进入可用设备列表;defaultOutputDevice会将 HDMI 设置为该模块的默认输出。
不要删除原有的mixPorts、devicePorts和routes。
十六、备份并推回设备
adb push hdmi_audio_policy_configuration.xml /data/local/tmp/ adb shell cp -a /vendor/etc/hdmi_audio_policy_configuration.xml /vendor/etc/hdmi_audio_policy_configuration.xml.bak adb shell cp /data/local/tmp/hdmi_audio_policy_configuration.xml /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chmod 644 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chown 0:0 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell sync adb reboot十七、重启后验证
adb root adb wait-for-device adb shell dumpsys media.audio_policy > audio_after.txt findstr /n /i "Available output devices Outputs HDMI_2 Selected Device" audio_after.txt修复成功后应看到:
Available output devices (3): Speaker HDMI_2 Telephony Tx活动输出中应出现:
IOProfile name:hdmi_stereo Devices: {AUDIO_DEVICE_OUT_HDMI, @:}媒体流会选择:
Selected Device: {AUDIO_DEVICE_OUT_HDMI, @:}此时 YouTube、系统提示音和播放器都可以通过电视正常出声。
十八、修复前后对比
修改前
ALSA plughw:0,3 可以出声 Android 系统没有 HDMI 声音 Available output devices (2) HDMI_2 只存在于 Declared devices Selected Device 为 Speaker修改后
Available output devices (3) HDMI_2 进入可用设备列表 hdmi_stereo 成为活动输出 Selected Device 为 AUDIO_DEVICE_OUT_HDMI YouTube 和系统声音正常十九、恢复原配置
adb root adb shell mount -o remount,rw / adb shell cp /vendor/etc/hdmi_audio_policy_configuration.xml.bak /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chmod 644 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell chown 0:0 /vendor/etc/hdmi_audio_policy_configuration.xml adb shell sync adb reboot二十、注意事项
不同设备的声卡号和设备号可能不同,必须先执行:
adb shell cat /proc/asound/pcm不同设备的 HDMI 配置名称可能不是
HDMI_2,应先搜索配置文件。alsa_aplay能响,才说明底层 HDMI 音频链路正常。HDMI_2出现在Declared devices,不代表已经可以使用。必须在
Available output devices中看到 HDMI,系统应用才可能路由到 HDMI。修改 XML 前一定要备份。
Windows CMD 中没有
grep,应使用findstr,或者把管道放进adb shell "..."中执行。重启后可能需要重新执行
adb root。如果仍然无声,可以先把电视数字音频输出设置为 PCM。
本方法适用于“ALSA 直出有声,但 Android Audio Policy 没有启用 HDMI”的情况。对于内核完全未识别 HDMI 声卡的设备无效。