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

相关推荐
小鹿研究点东西9 小时前
直播带货长视频AI自动剪辑开播:一场直播如何反复利用?
ffmpeg·自动化·音视频·语音识别
换个昵称都难10 小时前
webrtc PeerConnection 模块介绍
音视频·webrtc
潜创微科技11 小时前
4K60 over IP 方案简介
网络·嵌入式硬件·网络协议·tcp/ip·音视频
超哥--11 小时前
B站视频内容智能分析系统(三):B站视频自动采集
java·开发语言·音视频·ai编程
暗冰ཏོ14 小时前
Flutter 从入门到项目实战:Dart 基础、跨平台开发、App 架构与上线发布完整指南
flutter·架构·app·安卓·应用开发
localbob18 小时前
日语视频 SRT 字幕生成软件下载:日语视频本地自动翻译SRT字幕生成、日语视频自动翻译 Faster Whisper v1.7 下载与使用教程(含AMD显卡支持)
whisper·音视频·机器翻译·日语字幕翻译·日语视频翻译·本地ai翻译日语视频
音乐宝贝家19 小时前
吉他桶型技术解析:GA桶 vs D桶 vs OM桶——入门弹唱选哪个
新媒体运营·音视频·业界资讯·媒体·材质·零售·内容运营
luoyayun36119 小时前
Qt + FFmpeg 实战:获取音视频文件基础属性、流信息和元数据
qt·ffmpeg·音视频·元数据·获取音视频文件属性
Rudon滨海渔村20 小时前
ffmpeg裁剪视频黑屏、不准时等处理方式 - ffmpeg基本操作
ffmpeg·音视频
谁刺我心20 小时前
[QtCPP]Examples使用示例-QtMultimedia、QMediaPlayer、Audio音频引擎测试mp3播放
qt·音视频·qml