在 RK3588 上彻底禁用 HDMI 音频输出

在 RK3588 上彻底禁用 HDMI 音频输出:从临时调试到 AOSP 源码固化

适用平台 :Rockchip RK3588 / OK3588
Android 版本 :Android 10+(Audio Policy v7.0)
关键词audio_policy_configuration.xml、HDMI 音频禁用、AOSP 编译、vendor 分区、RK3588


背景

在基于 Rockchip RK3588 的嵌入式设备(如数字标牌、工控一体机)中,一个常见需求是:

视频通过 HDMI 输出到显示器,但音频必须强制从板载喇叭播放,完全不走 HDMI。

然而,默认 Android 系统会将 HDMI 视为合法的音频输出设备。一旦插入 HDMI 线,媒体音、通知音等会自动"切换"到 HDMI,导致喇叭无声------即使用户根本没有接音响。

本文记录了从手动调试验证AOSP 源码固化的完整过程,并总结了在 Rockchip 平台上容易踩的坑。


第一步:定位问题根源

Android 的音频路由策略由 /vendor/etc/audio_policy_configuration.xml 控制(注意:不是 /system/etc/)。

通过 adb 查看设备上的配置:

bash 复制代码
adb shell cat /vendor/etc/audio_policy_configuration.xml

发现其中包含以下关键定义:

xml 复制代码
<!-- HDMI 输出设备声明 -->
<devicePort tagName="HDMI Out" type="AUDIO_DEVICE_OUT_AUX_DIGITAL" role="sink"/>

<!-- HDMI 专用输出通道 -->
<mixPort name="hdmi" role="source" flags="AUDIO_OUTPUT_FLAG_DIRECT">
    <profile format="AUDIO_FORMAT_PCM_16_BIT" ... />
    <profile format="AUDIO_FORMAT_IEC61937" ... />
</mixPort>

<!-- 路由规则:primary output 和 hdmi 都可输出到 HDMI Out -->
<route type="mix" sink="HDMI Out" sources="primary output,hdmi"/>

这三处配置共同导致系统认为 HDMI 是一个有效的音频输出路径。


第二步:手动修改验证(快速原型)

为快速验证方案,采用"拉-改-推"方式:

bash 复制代码
adb root
adb remount
adb pull /vendor/etc/audio_policy_configuration.xml

编辑文件,删除以下三部分

  1. <mixPort name="hdmi" ...>
  2. <devicePort tagName="HDMI Out" ...>
  3. <route ... sink="HDMI Out" ...>

保存后推回设备并重启音频服务:

bash 复制代码
adb push audio_policy_configuration.xml /vendor/etc/
adb shell setprop ctl.restart audioserver

测试结果

  • 插拔 HDMI 线,声音始终从 Speaker 出
  • 媒体、通知、铃声全部正常
  • 视频输出不受影响

结论:方案有效!


第三步:固化到 AOSP 源码

既然手动修改可行,下一步是将改动写入 AOSP 源码,确保每次编译都包含此配置。

1. 找到正确的源码路径

对于 OK3588,音频策略文件通常位于:

复制代码
device/rockchip/common/audio_policy_configuration.xml

将手动验证成功的 XML 内容替换至此。

2. 确保 copy rule 正确

在设备的 .mk 文件中(如 device/rockchip/rk3588/rk3588.mk),必须包含:

makefile 复制代码
PRODUCT_COPY_FILES += \
        $(LOCAL_PATH)/audio_policy_configuration.xml:$(TARGET_COPY_OUT_VENDOR)/etc/audio_policy_configuration.xml \

否则,AOSP 不会将该文件打包进 vendor.img

3. 编译并生成镜像

bash 复制代码
source build/envsetup.sh
lunch your_ok3588_product-userdebug
make -j$(nproc) updateimg

注意:RK3588 推荐生成 update.img,而非仅刷 vendor.img


第四步:刷机与验证(关键!)

❌ 常见错误:仅用 fastboot flash vendor

在 Rockchip 平台上,标准 fastboot 无法可靠更新 vendor 分区。即使命令返回成功,设备启动时仍可能加载原始分区。

正确做法

使用官方 upgrade_tool 刷写 update.img

  1. 进入 Loader 模式(短接 Flash 引脚或 adb reboot loader)
  2. 加载 parameter.txtout/target/product/rk3588/update.img
  3. 点击 "Run" 完成全量更新

验证是否生效

刷机后立即检查文件一致性:

bash 复制代码
# 设备端 MD5
adb shell md5sum /vendor/etc/audio_policy_configuration.xml

# 本地源码 MD5
md5sum device/rockchip/rk3588/audio/audio_policy_configuration.xml

两者必须一致。

再重启音频服务:

bash 复制代码
adb shell setprop ctl.restart audioserver

最后播放媒体测试声音输出设备。


经验总结

问题 解决方案
HDMI 自动抢走音频 删除 policy 中的 HDMI Out 声明、mixPort 和 route
AOSP 修改不生效 检查 PRODUCT_COPY_FILES 是否指向正确路径
刷机后配置未更新 使用 update.img + upgrade_tool,避免依赖 fastboot
音频服务未加载新策略 手动重启 audioserver
多个同名配置文件冲突 检查 vendor/rockchip/common/etc/ 是否存在覆盖文件

补充说明

  • 保留 HDMIIn :配置中的 <item>HDMIIn</item> 是音频输入(如 ARC 回传),不影响输出,无需删除。
  • 不影响视频:仅禁用音频输出,HDMI 视频显示完全正常。
  • 编码与换行符 :确保 XML 文件为 UTF-8 无 BOM ,换行符为 LF,避免解析失败。

结语

看似简单的"禁用 HDMI 音频",实则涉及 Android 音频架构、AOSP 构建系统、Rockchip 平台特性三大层面。只有打通从策略配置 → 源码集成 → 镜像生成 → 设备刷写的全链路,才能实现稳定可靠的交付。

希望本文能帮助正在调试 RK3588 音频的你少走弯路。如有疑问,欢迎留言交流!

相关推荐
wj3055853787 小时前
课程 6:图生视频首次运行流程
人工智能·音视频
runafterhit7 小时前
显示调研专题-OLED 终端市场分析报告
音视频
天上路人7 小时前
A-59F所有应用模式说明
人工智能·硬件架构·音视频·语音识别·实时音视频
Likeadust11 小时前
企业级融媒体生产管理平台/智能会议管理系统EasyDSS构建一体化应急视频指挥体系
音视频·媒体
OsDepK13 小时前
AudioSplit音频多轨免费分离工具即将发布
ide·git·python·音视频·集成学习
playmaker9013 小时前
音频转mid、midi文件
音视频
EasyDSS13 小时前
私有化音视频系统/企业级融媒体平台EasyDSS优化升级让视频会议协作更高效
音视频·媒体
楼兰公子14 小时前
网络子系统学习与开发教程
rk3588·net
reasonsummer15 小时前
【办公类-135-01】20260515 视频去掉字幕-黑狐字幕工厂
音视频
AC赳赳老秦15 小时前
OpenClaw与Axure联动:自动生成原型图组件、批量修改原型样式,提升设计效率
python·web安全·ui·音视频·axure·photoshop·openclaw