车机中 Android Audio 音频常见问题分析方法实践小结
文章目录
- 前言
- 1. 无声
- 2. 断音
- 3. 杂音
- 4. 延迟播放
- 5. 焦点问题
- 6. 无声问题(连上 BT )
- 其他完善中……
前言
本文主要总结了一下车机开发中遇到的 Audio 有关的问题,同时参考网上的一案例,由于Audio 模块出现音频问题的场景很多,对每一个出现的问题,主要做思路上的分析,细节上不做进一步纠结,后期慢慢完善,先做一个框架性的总结。
1. 无声
实例:现象:蓝牙通话时,车机和手机均无声。
原因分析:
由于车机端断开了SCO(电话音频)的连接,所以车机端没有声音,手机端的 SCO 也没有建立。
常见思路:
整机无声(bt和手机一起播放声音时):通路策略切错;BT状态不对;data往BT走,BT 断开无法播放;全局静音;音量为 0;往下写 data 时中间出现了 mute ;
整机无声(只有手机):可能是播放设备没有正确选择,输出设备策略选择问题
A2DP无声:正常情况数据走 A2DP,实际上走了 SCO,但 SCO 无法接收,所以没有声音
SCO无声:网络原因;没有打开 mic
2. 断音
实例现象:车机连接蓝牙耳机,播放视频声音输出断断续续。
原因分析:
Framework端分析:Android dump pcm 文件,播放声音正常。排除Framework 端的 问题,转耳机硬件分析。
耳机端分析:从 btsnoop 里解析出来车机发出的音频无卡顿,数据帧也是饱和的,耳机端如果听到是断断续续有卡顿的话,是耳机的问题,换个耳机试。

常见思路:
在 其他平台如 MTK,audio dump 中 resample in 节点有断音,可能是 underrun,原因是 APP 写数据太慢,这种情况无法优化,只能三方解决。
在往下走的其他节点出现断音,通过调整 buffer 大小来解决(buffer一般情况不动,减少buffer会出现断音,增大buffer会出现延迟)。
数据写快了,写慢了都可能造成断音。(实际开发目前未遇到,后期遇到了再补充案例)。
3. 杂音
实例现象:连接蓝牙耳机,刚打开视频 App 播放的时候会有杂音
原因思路:爆破音,杂音, 需要提供 audio dump, tcpdump 以太网等日志结合分析。
Framework 分析:
- 连接耳机和不连接耳机都会有杂音的情况出现,只是喇叭不容易听出来,底层日志信息看视频App 中 AudioTrack 都有 underrun 提示。
- HAL 底层尝试加大视频播放器 AudioTrack buffer 大小后,仍然存在此问题,已说明是应用层写数据慢导致。
- 从audio dump 数据来看,杂音处数据只漏掉一两帧,但连续出现多次,导致出现“滋滋"的杂声。说明出问题时,写入数据处于断流的临界点附件。
分析结论:需视频 App端进一步分析部数据写入慢问题。
常见思路:
-
通过 audio dump定位,在节点 af_track 就有杂音属于是 APP 写下来的数据就有杂音。 资源文件就有杂音,无法优化。资源文件没有杂音,可能是在上层太忙,buffer太小,出现了underrun,造成了数据损坏,这种情况通过调整 buffer来解决,调整 frameCount,调大延时变长,request 太多,但是写的少,write 的数据就有可能丢失。杂音在中间,如effect,resample 等情况。
-
分析 dump,确定出现问题的节点,杂音分析 buffer,断音一般为underrun (上层app写数据太慢,供不应求,会造成断音或者杂音,解决方案一般是调整buffer大小,buffer调大)3秒一般是 standby。
4. 延迟播放
实例现象:CarPlay 中切换音乐歌曲延迟较高,大概 3秒。
原因分析:网络连接下延迟 1~3 秒属于正常现象,不同手机和不同的播放器在不同网络下表现不同。 该延迟由手机端控制,车机端无法优化。
常见思路:看最开始 write 数据的时间,可能最开始写的数据就是空的。或者是延迟的写数据的时间。
5. 焦点问题
这是一个比较大的模块,涉及到焦点策略,如混音、打断、禁止等策略。各 App 端需要和系统端的策略达成一致,另外,由于 车机上有很多的第三方应用,有些提供方不方便维护,要么就出现的问题维持现状,要么系统端 Audio 这边适配,具体问题再进一步分析。后面我会单独总结一些常见的音频焦点问题。
常见思路:排查关键字: CarAudioFocus、MediaFocus 等分析焦点栈,再结合焦点策略进一步分析焦点的申请与释放、消息的传递给 AudioManager 是否正确,App 端是否根据焦点变化处理了相关逻辑等。
6. 无声问题(连上 BT )
实例现象:蓝牙电话无声音
思路分析:
Framework 端先确认通道是否打开,采样率是否正确设置,与底层传递的参数是否正确,具体参数需要和底层沟通好。如关键字分析:
audio_hw_primary: adev_set_parameters: enter: open_source=0:2
audio_hw_primary: adev_set_parameters: enter: hfp_set_sampling_rate=48000
audio_hw_hfp: origin_audio_extn_hfp_set_parameters: hfp_enable=true
蓝牙端分析:
结合 log 分析,蓝牙电话调用的原生 hfp 通路,开机初始化时 hfp 通路接口初始化错误导致的。
audio_hw_primary: adev_set_parameters: enter: hfp_enable=true
audio_hw_hfp: origin_audio_extn_hfp_set_parameters: hfp_enable=true
常见思路: 考虑是否写了 data,有没有data传下来,data 是否为mute,上层 app 传递命令是否有错误,BT 协议不匹配,track start 后是不是马上停了。BT控制是否有问题。
其他完善中……
相关文章:
车机中 Android Audio 音频常见问题分析方法实践小结
文章目录 前言1. 无声2. 断音3. 杂音4. 延迟播放5. 焦点问题6. 无声问题(连上 BT )其他完善中…… 前言 本文主要总结了一下车机开发中遇到的 Audio 有关的问题,同时参考网上的一案例,由于Audio 模块出现音频问题的场景很多,对每一个出现的问…...
湘大 OJ 代码仓库
有时候不需要上传一些题解,想要上传一些纯代码就行,傻傻把代码上传到文章里面,感觉效率不是很高,还是建立一个代码仓库比较方便 需要会使用魔法可能才能访问,github代码仓库地址...
Ruoyi Cloud K8s 部署
本文视频版本:https://www.bilibili.com/video/BV1xF4Se3Esv 参考 https://blog.csdn.net/Equent/article/details/137779505 https://blog.csdn.net/weixin_48711696/article/details/138117392 https://zhuanlan.zhihu.com/p/470647732 https://gitee.com/y_project/Ruo…...
OpenGL Texture C++ Camera Filter滤镜
基于OpenGL Texture纹理的强大功能,在片段着色器(Shader)中编写GLSL代码,对YUV的数据进行数据转换从而实现视频编辑软件中的相机滤镜功能。 接上一篇OpenGL Texture C 预览Camera视频的功能实现,本篇来实现Camera滤镜效…...
基于Sobel算法的边缘检测设计与实现
1、边缘检测 针对的时灰度图像,顾名思义,检测图像的边缘,是针对图像像素点的一种计算,目的时标识数字图像中灰度变化明显的点,图像的边缘检测,在保留了图像的重要结构信息的同时,剔除了可以认为…...
java:练习
编写一个 Java 程序,计算并输出从 1 到用户指定的数字 n 中,所有“幸运数字”。幸运数字的定义如下:条件 1:数字的所有位数(如个位、十位)加起来的和是 7 的倍数。条件 2:数字本身是一个质数&am…...
大数据中一些常用的集群启停命令
文章目录 一、HDFS二、MapReduce && YARN三、Hive 一、HDFS 格式化namenode # 确保以hadoop用户执行 su - hadoop # 格式化namenode hadoop namenode -format启动 # 一键启动hdfs集群 start-dfs.sh # 一键关闭hdfs集群 stop-dfs.sh# 如果遇到命令未找到的错误&#…...
Golang、Python、C语言、Java的圆桌会议
一天,Golang、C语言、Java 和 Python 四位老朋友坐在编程领域的“圆桌会议”上,讨论如何一起完成一个任务:实现一个简单的高并发服务器,用于处理成千上万的请求。大家各抒己见,而 Golang 则是这次会议的主角。 1. Pyth…...
C语言编译原理
目录 一、C语言的编译过程 二、预处理 三、编译阶段 3.1 词法分析(Lexical Analysis) 3.2 语法分析(Syntax Analysis) 语法分析的主要步骤: 语法分析的关键技术: 构建AST: 符号表的维护…...
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C 目录 前言 一、取地址运算符重载 1. const修饰成员函数 2. 取地址运算符重载 二、深究构造函数 三、类型转换 四、static修饰成员 1. static修饰成员变…...
Apache POI 学习
Apache POI 学习 1. 引言2. 环境搭建MavenGradle 3. 基础概念4. 基本操作4.1 创建 Excel 文件4.2 读取 Excel 文件 5. 进阶操作5.1 设置单元格样式5.2 数据验证5.3 图表创建5.4 合并单元格5.5 居中对齐5.6 设置边框和字体颜色 6. 性能优化7. 总结 1. 引言 Apache POI 是一个用…...
福建科立讯通信 指挥调度管理平台 SQL注入漏洞
北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名: 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…...
4.qml单例模式
这里写目录标题 js文件单例模式qml文件单例模式 js文件单例模式 直接添加一个js文件到qml中 修改内容 TestA.qml import QtQuick 2.0 import QtQuick.Controls 2.12 import "./MyWork.js" as MWItem {Row{TextField {onEditingFinished: {MW.setA(text)}}Button…...
CACTI 0.8.7 迁移并升级到 1.2.7记录
升级前后环境 升级前: CactiEZ 中文版 V10 升级后: Ubuntu 2204 Cacti 1.2.7 升级原因:风险漏洞太多,升不尽,补不完. 升级流程 Created with Raphal 2.3.0 开始 DST:安装Ububtu/Mariadb/apache/php SRC:备份 DB/RRA 数据导入 结束 Cacti 依赖包 注意:UBUNTU下有些包,它非另外…...
OrionX vGPU 研发测试场景下最佳实践之Jupyter模式
在上周的文章中,我们讲述了OrionX vGPU研发测试场景下最佳实践之SSH模式,今天,让我们走进 Jupyter模式下的最佳实践。 • Jupyter模式:Jupyter是最近几年算法人员使用比较多的一种工具,很多企业已经将其改造集成开发工…...
国风编曲:了解国风 民族调式 五声音阶 作/编曲思路 变化音 六声、七声调式
中国风 以流行为基础加入中国特色乐器、调式、和声融为一体的风格 如:青花瓷、菊花台、绝代风华、江南等等等等 省流:中国风=流行民族乐 两者结合,民族元素越多越中国风 流行民族/摇滚民族/电子民族 注意:中国风≠…...
HTTP 响应状态码详解
HTTP状态码详解:HTTP状态码,是用以表示WEB服务器 HTTP响应状态的3位数字代码 小技巧: CtrlF 快速查找 Http状态码状态码含义100客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当…...
在服务器上开Juypter Lab教程(远程访问)
在服务器上开Juypter Lab教程(远程访问) 文章目录 在服务器上开Juypter Lab教程(远程访问)一、安装anaconda1、安装anaconda2、提权限3、运行4、同意协议5、安装6、是否要自动初始化 conda7、结束8、检查 二、Anaconda安装Pytorch…...
【硬件模块】SHT20温湿度传感器
SHT20是一个用IIC通信的温湿度传感器。我们知道这个就可以了。 它支持的电压范围是2.1~3.6V,推荐是3V,所以如果我们的MCU是5V的,那么就得转个电压才能用了。 IIC常见的速率有100k,400k,而SHT20是支持400k的(…...
Redhat 8,9系(复刻系列) 一键部署Oracle23ai rpm
Oracle23ai前言 Oracle Database 23ai Free 让您可以充分体验 Oracle Database 的能力,世界各地的企业都依赖它来处理关键任务工作负载。 Oracle Database Free 的资源限制为 2 个 CPU(前台进程)、2 GB 的 RAM 和 12 GB 的磁盘用户数据。该软件包不仅易于使用,还可轻松下载…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
在树莓派上添加音频输入设备的几种方法
在树莓派上添加音频输入设备可以通过以下步骤完成,具体方法取决于设备类型(如USB麦克风、3.5mm接口麦克风或HDMI音频输入)。以下是详细指南: 1. 连接音频输入设备 USB麦克风/声卡:直接插入树莓派的USB接口。3.5mm麦克…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
