Android Audio
该专栏为热销专栏榜 第43名
文章平均质量分 92
本专栏主要是博主在Audio学习和开发过程中的相关笔记,主要以分析源码调用流程为主,同时包含开发中遇到的相关问题及解决过程分析。源码部分主要分析的是Android 11,有什么问题或者其他需求也可以评论或留言。在后续开发中也会对文章不断进行更新完善。
优惠券已抵扣
余额抵扣
还需支付
¥69.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
c小旭
Android Framework车载智能座舱开发工程师
展开
-
Android Audio其他——录音
AudioRecord 是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据,即 PCM 数据,PCM 数据不能被播放器直接播放,需要编码压缩成常见音频格式才能被播放器识别。而我们之前分析的原生 api 中的 AudioTrack 可以直接播放 PCM 数据。原创 2023-06-12 15:16:15 · 1983 阅读 · 0 评论 -
Android Audio分区——设置关联用户(六)
在音频分区的相关 API 接口中有一个比较重要的功能,就是设置关联用户。在介绍设置关联用户之前我们先来看两个比较重要的概念,设备亲和性和音频混合策略。原创 2024-09-04 08:56:03 · 379 阅读 · 0 评论 -
Android Audio分区——API接口详解(五)
上一篇文章介绍了音频分区的相关 API 接口,这里我们来看一下 CarAudioManager 中对应接口的实现。通过前面的文章我们知道,对应 CarAudioManager 中接口的实现都是在 CarAudioService 完成的。原创 2024-09-03 09:01:52 · 413 阅读 · 0 评论 -
Android Audio分区——音频分区相关API(四)
上一篇文章我们介绍了车载多区音频的相关基础内容以及相关配置文件,这里我们看进一步看一下音频分区的相关代码,想要快速了解音频分区相关功能,首先从其相关接口开始。原创 2024-09-03 09:00:13 · 546 阅读 · 0 评论 -
Android Audio分区——音频分区加载流程(三)
上一篇文章介绍了车载多区音频基础,并且知道每个音频区都在 car_audio_configuration.xml 文件中进行配置的,这里我们就来看一下音频分区的解析过程。原创 2024-09-02 09:02:22 · 940 阅读 · 0 评论 -
Android Audio分区——音频分区管理(二)
对于前面介绍的关联用户的相关功能,其实就是相当于 Audio 模块的多用户开发,这里我们再来看一下音频分区的管理工作。原创 2024-09-02 09:01:45 · 382 阅读 · 0 评论 -
Android Audio分区——车载多区音频基础(一)
汽车音频服务使用 Core Audio 动态音频政策来为车载使用场景提供协助。为每位乘客单独播放音频(称为多区音频),其中每个音频区允许并发播放声音。动态音频区配置。乘客主区音频投放。乘客的音频镜。在每个用例中,车载音频服务都使用动态音频政策自动将音频路由到指定的输出设备。原创 2024-08-29 09:21:09 · 661 阅读 · 0 评论 -
Android Audio实战——声道信息回调(六)
音频中的声道配置从单声道到双声道(立体声)、再到多声道系统(如5.1和7.1),代表了声音录制和回放技术的发展,旨在提供越来越丰富和沉浸式的听觉体验。原创 2024-06-18 08:47:52 · 1166 阅读 · 0 评论 -
Android Audio实战——音频流释放调用(五)
通过上一篇文章的分析,接下来需要分析的是 AudioSystem 中 stopOutput() 和 releaseOutput() 调用是不是存在时序问题,即调用 releaseOutput() 前有没有调用 stopOutput() 的问题。原创 2024-06-17 08:53:48 · 1135 阅读 · 0 评论 -
Android Audio实战——音频流释放异常(四)
遇到一个音频流释放异常导致的崩溃问题,这里我们先来看一下相关的异常信息。原创 2024-06-17 08:52:59 · 1090 阅读 · 0 评论 -
Android Audio实战——自适应音量值适配(三)
上一篇文章《音频配置资源定制》介绍了通过车型 Code 的不同,加载不通的 Audio 配置文件,而在《自适应音量值修改》又使用了 overlay 的方式定制不同车型的自适应音量。那么问题来了,通过修改车辆的配置字无法修改 overlay 中的资源,因为 overlay 依赖编译的时候 lunch 项目实现的,所以在实现自适应音量的时候也需要通过车辆的配置自适应不同的音量值。 参考前面两篇文章,首先定义一个车型与配置字的映射关系。文件位置:/device/xxx/audio/sa8155_xx原创 2024-08-29 09:19:50 · 544 阅读 · 0 评论 -
Android Audio实战——音频配置资源定制(二)
上一篇我们通过修改 FW 层代码对系统的自适应音量,那么对于不同车型的其他 Audio 属性(audio_policy_configuration.xml 中的内容)也有变化,那样对于每一个车型都要编译出一个版本,是不是也很麻烦。有没有一种修改方式,可以直接通话车型的代码加载不同的 audio_policy_configuration.xml 文件呢。原创 2024-06-06 09:01:57 · 2741 阅读 · 3 评论 -
Android Audio实战——自适应音量值修改(一)
对于车机开发来说,为了方便维护我们也可以定义一套自定义音量值的 xml 文件。原创 2024-06-06 09:00:59 · 1077 阅读 · 0 评论 -
Android AAudio——音频流释放死锁(七)
在处理 AudioTrack 句柄的析构逻辑时,是否需要加锁取决于多个因素,包括但不限于:并发访问:如果在 AudioTrack 的生命周期内,有多个线程可能访问或修改其内部状态(比如读写缓冲区、状态标志等),那么在析构时应当加锁以防止数据竞争和不一致性问题。资源释放顺序:如果 AudioTrack 的析构过程中涉及到了解注册回调、关闭硬件资源、释放内存等操作,这些操作可能依赖于当前的系统状态或与其他组件交互,加锁可以帮助确保这些操作的原子性和正确性。原创 2024-06-05 09:24:59 · 404 阅读 · 1 评论 -
Android AAudio——C API创建AudioTrack(六)
虽然 AAudio 试图提供一种直接的硬件访问途径,但在某些场景下,如处理兼容性问题、使用系统服务(如 AudioFlinger)或者在某些设备上,使用 AudioTrack 可能是最有效或最合适的途径。这并不违背 AAudio 的初衷,因为它的目标是提供高性能的音频处理,而不是避免使用系统服务。在某些实现中,如果能通过 AudioTrack 实现这一目标,那么使用 AudioTrack 就是合理的策略。所以,这里我们来看一下 builder_createStream() 方法中的另一个分支。原创 2024-06-05 09:24:21 · 807 阅读 · 0 评论 -
Android AAudio——C API读/写音频流(五)
对于音频流的操作,除了前面介绍的音频流打开、开始、暂停、停止和清除等,最主要的操作便是通过音频流的读/写操作来处理音频数据,这里我们就来介绍一下音频流读/写音频数据的操作。原创 2024-06-04 09:19:53 · 508 阅读 · 1 评论 -
Android AAudio——C API控制音频流(四)
下图是状态变化流程图,虚线框表示瞬时状态,实线框表示稳定状态。原创 2024-06-04 09:19:27 · 507 阅读 · 0 评论 -
Android AAudio——C API创建音频流(三)
AAudio C API 不是直接通过 AudioTrack API 来播放音频。AudioTrack 是 Android 提供的 Java API,用于在Android平台上播放音频,而 AAudio 是 Google 推出的一个原生音频库,旨在提供更低延迟和更高性能的音频处理。AAudio 库是直接与硬件交互的,它绕过了传统的 AudioTrack 和 AudioRecord,提供了更直接的硬件访问。原创 2024-06-03 09:00:05 · 965 阅读 · 0 评论 -
Android AAudio——AAudio调用流程(二)
从上面的整个流程可以看到,AAudio 并没有走 AudioTrack 和 AudioRecod,但最终还是要通过 AudioFlinger 打开音频通路和创建播放线程。AAudio 核心原理是通过内存映射来减小内存数据拷贝次数,增加音频传输效率,减小延迟。AAudioServiceStreamMMAP 创建流之后得到了 AAudioServiceEndpointMMAP 类型的对象,后续对音频流的操作都是 通过操作这个对象来实现的。原创 2023-06-12 11:28:21 · 1574 阅读 · 0 评论 -
Android AAudio——AAudio基础(一)
AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。应用程序传入音频流和从音频流读取数据来实现这种音频数据的传递。AAudio 的实现围绕音频数据传递,围绕音频流进行。AAudio 的数据传递主要有两种工作模式,一种是 MMap 模式,此时客户端 AAudio 库从 media.aaudio 服务获得一块共享内存,并通过这块共享内存将数据传给设备;原创 2023-06-12 11:24:59 · 1654 阅读 · 0 评论 -
Android Audio音量——音量Group设置(十)
在 Android Audio 开发中,Volume Group(音量组)是一个重要的概念,它用于对不同类型的音频流进行音量控制。通过音量组,开发者可以更加灵活地管理音频流的音量,提供更好的用户体验。在 Android 系统中,音频流被分为多种类型,例如音乐播放、通话、系统声音等。每种类型的音频流都有自己的音量控制,但是这些音量控制通常是相互独立的,用户需要分别调整每个音频流的音量。而音量组的概念则是将这些音频流按照一定的规则进行分组,然后对整个组进行音量控制。原创 2024-05-07 08:59:58 · 209 阅读 · 0 评论 -
Android Audio音量——音频类型新增(九)
在实际开发中,经常会遇到需要新增一个音频类型(usage)的需求,这里我们简单介绍一下需要修改的代码。原创 2023-12-22 16:25:51 · 921 阅读 · 0 评论 -
Android Audio音量——音频设备管理(八)
通常带线耳机分类,模拟耳机和数字耳机。原创 2023-06-09 17:42:42 · 1649 阅读 · 0 评论 -
Android Audio音量——硬按键调节音量(七)
前面的文章已经介绍了音量调整及静音设置的相关调用,这里我们来梳理一下通过硬按键来调节音量及静音的相关调用流程。原创 2024-08-28 22:01:40 · 688 阅读 · 0 评论 -
Android Audio音量——静音设置(六)
对于音量调节,对于车机 Audio 开发来说是相当重要的一个功能,主要分为系统音量、通话音量、导航音量、铃声音量、语音音量(微信等第三方应用)等。前面已经对音量调节有了详细分析分析,但这里还是有必要对音量静音功能进行分析。原创 2023-11-10 11:23:30 · 767 阅读 · 0 评论 -
Android Audio音量——音量增益HAL(五)
前面的文章对音量设置中的音量增益流程 setCurrentGainIndex 方法我们分析到了 native 层就没有往下分析,这里我们继续分析下面的流程。原创 2023-11-13 11:46:01 · 862 阅读 · 0 评论 -
Android Audio音量——音量调节HAL(四)
1、根据 device、streamType 找到 attribute、strategy、volumeCurves 音量曲线等。2、找到需要进行音量调整的通道,主要是根据 attribute、客户端 client 对应的 volumeGroup 是否一致,以及 AudioOutputDescriptor 的 device 和上层传入下来的 device 是否相同。原创 2023-06-09 13:34:25 · 1860 阅读 · 0 评论 -
Android Audio音量——音量设置(三)
前面介绍了音量调节的两种常见方法,上一篇我们分析了音量增减的代码调用流程,这里我们看一下另一个设置音量的方法 setStreamVolume()。原创 2023-11-10 15:59:17 · 606 阅读 · 0 评论 -
Android Audio音量——音量增减(二)
adjustStreamVolume()方法所需要的音量操作参数,可以在 AudioManager.java 中查看。参数值含义增加音量降低音量显示音量,但不设置静音取消静音切换静音状态1)利用设置的音频流类型 streamType 找到对应的音量状态管理类 VolumeStreamState,此类集合的音量管理的核心方法,内部有一个 map 集合保存了所有输出设备及其对应的音量等级 index,最终也是调整这个 index。原创 2023-06-09 13:29:36 · 2926 阅读 · 0 评论 -
Android Audio音量——音量调节基础(一)
前面的文章中提到过,AudioService 的主要功能之一就是负责调节音量,这一篇文章主要详细介绍一下 AudioService 中音量调节相关的知识点。原创 2023-06-09 13:26:48 · 1371 阅读 · 0 评论 -
Android Audio焦点——音频焦点Log分析(五)
源码位置:frameworks/base/services/core/java/com/android/server/audio/MediaFocusControl.javauid/pid:用来识别应用信息。clientId:请求焦点的客户端ID,通常是应用程序的包名。callingPack=com.app.voiceadapter:调用申请音频焦点方法的应用程序的包名。req:申请的焦点类型。AUDIOFOCUS_NONE = 0:未获得焦点。原创 2023-11-27 17:42:23 · 292 阅读 · 0 评论 -
Android Audio焦点——音频焦点策略(四)
前面的文章已经介绍了,音频焦点策略用于处理多个音频的发出声音时,各个音频播放状态的改变。如果不对音频播放那个进行管理,那么多声音将会一起发出,这样会严重影响人们的体验,因此在开发过程中,如果存在音频相关的功能,必须要吧空音频焦点策略。原创 2023-12-05 18:00:39 · 1140 阅读 · 0 评论 -
Android Audio焦点——音频焦点监听(三)
其实上面的流程就是应用申请/放弃焦点的回调方法,以及应用被动失去焦点和重新获取焦点的回调流程。原创 2023-11-30 14:00:03 · 1161 阅读 · 0 评论 -
Android Audio焦点——音频焦点申请(二)
前面我们已经介绍了音频焦点的相关基础知识,现在我们来看一下对于 APP 应用来说获取焦点、监听焦点和释放音频焦点的相关实现,已经对应的 Android 源码调用流程。原创 2023-06-06 15:32:58 · 1807 阅读 · 0 评论 -
Android Audio焦点——音频焦点基础(一)
当您的应用需要输出音频时,应该请求音频焦点。只有在获得音频焦点后,才能开始播放。但是,在播放过程中可能无法把音频焦点一直据为己有,因为其它应用程序可以发出音频焦点的请求来抢占音频焦点,这种情况下,您的应用可以选择暂停播放或者降低音量,这样用户才能更清晰地听到其它应用程序的音频。原创 2023-06-06 13:21:00 · 921 阅读 · 0 评论 -
Android Audio基础——音频模式设置(十九)
在《音频属性设是置》中介绍使用 setParameters 设置音频属性时,就是以设置音频模式及为例进行讲解的,其实在 AudioManager 中同样存在一个接口用来设置音频模式的,这里我们就来看一下。原创 2024-08-28 22:02:18 · 1087 阅读 · 0 评论 -
Android Audio基础——音频属性设置(十八)
音量(volume):使用 setParameters("volume=5") 将音量设置为 5(范围一般为 0 到 10)。静音(mute):使用 setParameters("mute=true") 将音频静音,或使用 setParameters("mute=false") 解除静音。语音合成引擎(engine):如果设备上有多个语音合成引擎可用,使用 setParameters("engine=xxx") 来选择使用特定的引擎(例如 Google TTS 或 Microsoft TTS)。原创 2023-11-29 15:13:38 · 993 阅读 · 0 评论 -
Android Audio基础——音频链路分析(十七)
Audacity 是一款免费的开源音频编辑和录音软件。它提供了多种功能,包括录音、剪切、复制、粘贴、混音、编辑效果等。Audacity 支持多种常见音频格式,如 MP3、WAV、AIFF 等,并且可以导入和导出这些格式的文件。使用 Audacity,用户可以轻松地录制声音,包括麦克风录音、线路输入录音和电脑音频录制。它还有一个直观的界面,可以让用户混合不同的音轨、编辑音频段落和应用各种效果,如音量调整、消音、回声、变速等。原创 2023-12-06 17:28:51 · 998 阅读 · 0 评论 -
Android Audio基础——MediaPlayer播放音频(十六)
Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack。简单来说,MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源。SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频。而 AudioTrack 则更接近底层,提供了非常强大的控制能力,支持低延迟播放,适合流媒体和VoIP 语音电话等场景。原创 2023-06-06 17:21:26 · 2802 阅读 · 0 评论 -
Android Audio基础——AudioTrack音频控制(十五)
AudioTrack 是用于播放音频数据的类,可以使用 set 方法设置音频数据,然后使用 start 来启动播放。而 pause 和 stop 则是用于控制播放过程的方法。不管 APP 使用什么播放音频文件,最终都是由 AudioTrack 将数据传递下去。原创 2023-12-25 18:01:57 · 715 阅读 · 0 评论