车机中 Android Audio 音频常见问题分析方法实践小结

news2024/11/23 7:46:47

文章目录

  • 前言
  • 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 分析:

  1. 连接耳机和不连接耳机都会有杂音的情况出现,只是喇叭不容易听出来,底层日志信息看视频App 中 AudioTrack 都有 underrun 提示。
  2. HAL 底层尝试加大视频播放器 AudioTrack buffer 大小后,仍然存在此问题,已说明是应用层写数据慢导致。
  3. 从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控制是否有问题。

其他完善中……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Blender渲染太慢怎么办?blender云渲染已开启

动画行业蓬勃发展,动画制作软件亦持续推陈出新,当制作平台日益丰富,创作难度降低,创作效率提升,如何高效完成复杂动画的渲染就成了从业者更关心的问题。 云渲染技术的出现,无疑为动画制作者提供了前所未有…

家庭理财管理系统

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 家庭理财管理系统拥有多种角色,可以自行设置权限和用户等,主要功能有: 收入管理、支付管理、资产管理、负债详情、统计报表、家庭成员管理、用户管理等…

JavaSE - 易错题集 - 006

1. 哪个正确 A abstract类只能用来派生子类,不能用来创建abstract类的对象。 B final类不但可以用来派生子类,也可以用来创建final类的对象。 C abstract不能与final同时修饰一个类。 D abstract类定义中可以没有abstract方法。 正确答案&#xff1…

决策树算法上篇

决策树概述 决策树是属于有监督机器学习的一种,起源非常早,符合直觉并且非常直观,模仿人类做决策的过程,早期人工智能模型中有很多应用,现在更多的是使用基于决策树的一些集成学习的算法。 示例一: 上表根据…

1.C++中程序的基本结构

在教孩子的学习过程中,使用的开发IDE为小熊猫Dev-C 6.7.5版本,以后的复杂截图,基本上都是基于此版本进行的,同时在适当的时候,录制视频也会基于此版本来完成。 以下为一个最基本的C程序 int main() {// 程序主体retur…

无痛生娃,00后当妈啦

姐妹们,你们家开始催婚了吗?我是00后,大学也才毕业一年啊,我妈已经开始给我物色对象,过年让我去相亲了!大学的时候不让谈,说怕异地以后感情不稳定,结果呢,一毕业要我结婚…

频域滤波为什么使用psf2otf函数?线性卷积和循环卷积等效的条件

线性卷积和循环卷积是本质不同的运算。然而,在某些条件下,线性卷积和循环卷积是等效的。建立这种等效关系具有重要意义。对于两个向量 x 和 y,循环卷积等于二者的离散傅里叶变换 (DFT) 之积的逆 DFT 变换。 禹晶、肖创柏、廖庆敏《数字图像处…

基于python+django+mysql+Nanodet检测模型的水稻虫害检测系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

『功能项目』项目优化 - 框架加载资源【41】

我们打开上一篇40播放动画时禁止点击移动的项目, 本章要做的事情是搭建一个资源加载框架,让UI界面,人物模型以及场景都存放在资源文件夹中在运行时加载出来 首先在资源商店加载资源 将怪物模型放置场景中 将普通管线模型切换成URP 重命名为…

重学SpringBoot3-集成RocketMQ(二)

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成RocketMQ(二) 1. 基础概念2. 准备工作3. 实现事务消息的生产者4. 事务监听器实现5. 消费者示例6. 发送事务消息7. 测试7.1 模…

rust学习——关联类型

什么是关联类型 关联类型是Rust中一种特殊的泛型抽象机制。在trait中,可以定义一个或多个关联类型,这些关联类型与trait的实现类型相关联。关联类型允许我们在trait中使用泛型,但不需要提前指定具体的类型。 不使用关联类型存在的问题 tra…

AI生成头像表情包,一次十分钟,就能实现月入过万的玩法,无脑操作

今天给大家带来的项目是AI生成表情包和头像,这个项目对于我们做ip来说是真心不错,就比如我这个头像。 为什么说每天只需要10分钟呢,那么我们继续往下看。 "项目介绍 这个项目的核心其实就是使用AI生成表情包或者说生成头像&#xff0c…

华为HCIA、HCIP和HCIE认证考试明细

华为认证体系包括三个主要等级:HCIA(华为认证ICT助理)、HCIP(华为认证ICT高级工程师)和HCIE(华为认证ICT专家)。每个等级的认证都有其特定的考试内容和费用。 HCIA(华为认证ICT助理…

天翼云2024年最新版本认证必过资料(应知+从业者+解决方案架构师+高级解决方案架构师)

本资料为2024年认证最新材料,笔者因为工作需要考几个认证。天冀云全套认证包含如下图所示,本材料包含下图中红框内的 4个认证(应知从业者解决方案架构师高级解决方案架构师)。 笔者,亲测必过。见文章下面第二张考试记录…

模型加载pytorch版本不匹配的解决思路

模型部署总是会遇到pytorch版本推理与训练不匹配的问题&#xff0c;一般报错&#xff1a; AttributeError: Cant get attribute _rebuild_parameter_v2 on <module torch._utils from /usr/local/python3.9.0/lib/python3.9/site-packages/torch/_utils.py>提示pytorch …

医疗机构关于DIP/DRG信息化建设

推进DIP/DRG支付方式改革是一项系统性工程&#xff0c;牵一发而动全身。作为河北省DIP试点医院&#xff0c;河北医科大学第二医院将信息化与创新性管理理念融合&#xff0c;用好支付工具做好精细化管理&#xff0c;积极应对改革。 ■ 改革背景 国家医疗保障局制定的《DRG/DIP支…

18060 删除空格

**思路**: 1. 使用两个指针&#xff0c;一个指向当前字符位置&#xff0c;另一个指向下一个非空格字符应该放置的位置。 2. 遍历字符串&#xff0c;如果当前字符不是空格&#xff0c;则将其移动到目标位置指针处&#xff0c;并递增目标位置指针。 3. 最后在目标位置指针处添加字…

scratch作品练习-- 猫猫接月饼

作品展示 猫猫接月饼 作品设计 1&#xff09;内容&#xff1a; 嫦娥在最上方抛落月饼&#xff0c;猫猫要移动接住从上方掉落的月饼&#xff0c;接到月饼得分&#xff0c;没接住月饼落地消失。 2&#xff09;角色&#xff1a; 猫猫、月饼、嫦娥 3&#xff09;背景&#xff…

这么好用的桌面插件 怎么能不分享给你!

这么好用的桌面插件 怎么能不分享给你&#xff01;大家可能需要在桌面上创建一些功能&#xff0c;比如时间&#xff0c;日期&#xff0c;时钟&#xff0c;天气等&#xff0c;这时候就需要桌面插件才能实现&#xff0c;小编找过很多桌面插件或者桌面组件&#xff0c;发现了一个宝…

从0开始学习 RocketMQ:分布式事务消息的实现

消息队列中的事务&#xff0c;主要是解决消息生产者和消息消费者数据一致性的问题。 应用场景 比如订单系统创建订单后&#xff0c;会发消息给购物车系统&#xff0c;将已下单的商品从购物车中删除。 由于购物车删除商品这一步骤并不是用户下单支付这个主流程中的核心步骤&a…