在 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 音频的你少走弯路。如有疑问,欢迎留言交流!

相关推荐
zzq77971 小时前
Android 16 API 36 升级后 APP 加固兼容性问题解析
android·开发语言·安全·kotlin·安卓·安全架构
tedcloud12313 小时前
OmniRoute怎么部署?开源AI模型路由平台Linux部署教程
linux·服务器·人工智能·开源·音视频
潜创微科技16 小时前
8K HDMI 2.1 多源切换芯片方案,一颗芯片搞定长线不黑屏
音视频
音视频牛哥17 小时前
一款优秀的视频直播软件应具备哪些核心功能?结合 SmartMediaKit 谈实时音视频系统的能力边界
音视频·视频直播·低延迟rtsp播放器·gb28181接入·rtsp服务器·低延迟rtmp播放器·鸿蒙next rtsp
AI小码17 小时前
把动作「画」给视频世界模型,跨本体双向推演,李飞飞参与
大数据·人工智能·算法·ai·大模型·音视频·编程
嵌入式-老费19 小时前
esp32开发与应用(边采样边播放音频)
音视频
XMAIPC_Robot19 小时前
RK3588+8路AHD+双CAN工控方案|多路模拟视频同步采集+工业总线联动AI边缘检测落地
人工智能·rk3588·ai视觉·图像采集·多路ahd视频
中微极客20 小时前
Veo视频生成与Gemini Agent平台集成实践
数据库·人工智能·oracle·音视频
码龙-DragonCoding21 小时前
一键批量提取音频、提取视频
android·音视频·提取
阿童木写作21 小时前
Temu商品图批量翻译工具免费,AI视频字幕翻译+智能抠图
人工智能·python·音视频