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

相关推荐
xingqing87y1 小时前
索尼拍摄的视频怎么调亮度
音视频
好游科技1 小时前
使用WebRTC开发直播系统与音视频语聊房实践指南
音视频·webrtc·im即时通讯·社交软件·私有化部署im即时通讯·社交app
AI营销快线15 小时前
车企AI营销内容生产:2025图文与视频生成实战指南
人工智能·音视频
EasyCVR17 小时前
视频汇聚平台EasyCVR助力农场实现全场景可视化管理
大数据·人工智能·音视频
漫长的~以后17 小时前
Qwen2.5-Omni横空出世:四模态统一模型如何破解音视频同步难题?
音视频
Likeadust18 小时前
视频推流平台EasyDSS无人机推流直播技术在国土测绘中的创新应用
音视频·无人机
小咖自动剪辑18 小时前
提升电商素材剪辑效率:多场景内容自动生成流程解析
人工智能·实时互动·音视频·语音识别·视频编解码
优选资源分享19 小时前
MCC音频剪辑工具v1.1.0.0:自动处理配音气口间隙
音视频
昨日之日200620 小时前
HunyuanVideo-Foley V2版 - AI视频配音 自动识别视频内容并配音 支持50系显卡 一键整合包下载
人工智能·音视频