![](https://img-blog.csdnimg.cn/9cd4f4702d0542daae0234508b2f26cb.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android Audio
![](https://csdnimg.cn/release/blogv2/dist/pc/img/columnHotIcon1.png)
文章平均质量分 91
本专栏主要是博主在Audio学习和开发过程中的相关笔记,主要以分析源码调用流程为主,同时包含开发中遇到的相关问题及解决过程分析。源码部分主要分析的是Android 11,有什么问题或者其他需求也可以评论或留言。在后续开发中也会对文章不断进行更新完善。
优惠券已抵扣
余额抵扣
还需支付
¥59.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
c小旭
Android Framework车载智能座舱开发工程师
展开
-
Android Audio其他——录音
AudioRecord 是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据,即 PCM 数据,PCM 数据不能被播放器直接播放,需要编码压缩成常见音频格式才能被播放器识别。而我们之前分析的原生 api 中的 AudioTrack 可以直接播放 PCM 数据。原创 2023-06-12 15:16:15 · 1848 阅读 · 0 评论 -
Android Audio实战——声道信息回调(五)
音频中的声道配置从单声道到双声道(立体声)、再到多声道系统(如5.1和7.1),代表了声音录制和回放技术的发展,旨在提供越来越丰富和沉浸式的听觉体验。原创 2024-06-18 08:47:52 · 1086 阅读 · 0 评论 -
Android Audio实战——音频流释放调用(四)
通过上一篇文章的分析,接下来需要分析的是 AudioSystem 中 stopOutput() 和 releaseOutput() 调用是不是存在时序问题,即调用 releaseOutput() 前有没有调用 stopOutput() 的问题。原创 2024-06-17 08:53:48 · 842 阅读 · 0 评论 -
Android Audio实战——音频流释放异常(三)
遇到一个音频流释放异常导致的崩溃问题,这里我们先来看一下相关的异常信息。原创 2024-06-17 08:52:59 · 679 阅读 · 0 评论 -
Android Audio实战——音频配置资源定制(二)
上一篇我们通过修改 FW 层代码对系统的自适应音量,那么对于不同车型的其他 Audio 属性(audio_policy_configuration.xml 中的内容)也有变化,那样对于每一个车型都要编译出一个版本,是不是也很麻烦。有没有一种修改方式,可以直接通话车型的代码加载不同的 audio_policy_configuration.xml 文件呢。原创 2024-06-06 09:01:57 · 109 阅读 · 3 评论 -
Android Audio实战——自适应音量值修改(一)
对于车机开发来说,为了方便维护我们也可以定义一套自定义音量值的 xml 文件。原创 2024-06-06 09:00:59 · 741 阅读 · 0 评论 -
Android AAudio——音频流释放死锁(七)
在处理 AudioTrack 句柄的析构逻辑时,是否需要加锁取决于多个因素,包括但不限于:并发访问:如果在 AudioTrack 的生命周期内,有多个线程可能访问或修改其内部状态(比如读写缓冲区、状态标志等),那么在析构时应当加锁以防止数据竞争和不一致性问题。资源释放顺序:如果 AudioTrack 的析构过程中涉及到了解注册回调、关闭硬件资源、释放内存等操作,这些操作可能依赖于当前的系统状态或与其他组件交互,加锁可以帮助确保这些操作的原子性和正确性。原创 2024-06-05 09:24:59 · 327 阅读 · 0 评论 -
Android AAudio——C API创建AudioTrack(六)
虽然 AAudio 试图提供一种直接的硬件访问途径,但在某些场景下,如处理兼容性问题、使用系统服务(如 AudioFlinger)或者在某些设备上,使用 AudioTrack 可能是最有效或最合适的途径。这并不违背 AAudio 的初衷,因为它的目标是提供高性能的音频处理,而不是避免使用系统服务。在某些实现中,如果能通过 AudioTrack 实现这一目标,那么使用 AudioTrack 就是合理的策略。所以,这里我们来看一下 builder_createStream() 方法中的另一个分支。原创 2024-06-05 09:24:21 · 740 阅读 · 0 评论 -
Android AAudio——C API读/写音频流(五)
对于音频流的操作,除了前面介绍的音频流打开、开始、暂停、停止和清除等,最主要的操作便是通过音频流的读/写操作来处理音频数据,这里我们就来介绍一下音频流读/写音频数据的操作。原创 2024-06-04 09:19:53 · 417 阅读 · 1 评论 -
Android AAudio——C API控制音频流(四)
下图是状态变化流程图,虚线框表示瞬时状态,实线框表示稳定状态。原创 2024-06-04 09:19:27 · 456 阅读 · 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 · 905 阅读 · 0 评论 -
Android AAudio——AAudio调用流程(二)
从上面的整个流程可以看到,AAudio 并没有走 AudioTrack 和 AudioRecod,但最终还是要通过 AudioFlinger 打开音频通路和创建播放线程。AAudio 核心原理是通过内存映射来减小内存数据拷贝次数,增加音频传输效率,减小延迟。AAudioServiceStreamMMAP 创建流之后得到了 AAudioServiceEndpointMMAP 类型的对象,后续对音频流的操作都是 通过操作这个对象来实现的。原创 2023-06-12 11:28:21 · 1446 阅读 · 0 评论 -
Android AAudio——AAudio基础(一)
AAudio 在应用程序和 Android 设备上的音频输入输出之间移动音频数据。应用程序传入音频流和从音频流读取数据来实现这种音频数据的传递。AAudio 的实现围绕音频数据传递,围绕音频流进行。AAudio 的数据传递主要有两种工作模式,一种是 MMap 模式,此时客户端 AAudio 库从 media.aaudio 服务获得一块共享内存,并通过这块共享内存将数据传给设备;原创 2023-06-12 11:24:59 · 1343 阅读 · 0 评论 -
Android Audio音量——音量Group设置(九)
在 Android Audio 开发中,Volume Group(音量组)是一个重要的概念,它用于对不同类型的音频流进行音量控制。通过音量组,开发者可以更加灵活地管理音频流的音量,提供更好的用户体验。在 Android 系统中,音频流被分为多种类型,例如音乐播放、通话、系统声音等。每种类型的音频流都有自己的音量控制,但是这些音量控制通常是相互独立的,用户需要分别调整每个音频流的音量。而音量组的概念则是将这些音频流按照一定的规则进行分组,然后对整个组进行音量控制。原创 2024-05-07 08:59:58 · 97 阅读 · 0 评论 -
Android Audio音量——音频类型新增(八)
在实际开发中,经常会遇到需要新增一个音频类型(usage)的需求,这里我们简单介绍一下需要修改的代码。原创 2023-12-22 16:25:51 · 649 阅读 · 0 评论 -
Android Audio音量——音频设备管理(七)
通常带线耳机分类,模拟耳机和数字耳机。原创 2023-06-09 17:42:42 · 1485 阅读 · 0 评论 -
Android Audio音量——静音设置(六)
对于音量调节,对于车机 Audio 开发来说是相当重要的一个功能,主要分为系统音量、通话音量、导航音量、铃声音量、语音音量(微信等第三方应用)等。前面已经对音量调节有了详细分析分析,但这里还是有必要对音量静音功能进行分析。原创 2023-11-10 11:23:30 · 586 阅读 · 0 评论 -
Android Audio音量——音量增益HAL(五)
前面的文章对音量设置中的音量增益流程 setCurrentGainIndex 方法我们分析到了 native 层就没有往下分析,这里我们继续分析下面的流程。原创 2023-11-13 11:46:01 · 755 阅读 · 0 评论 -
Android Audio音量——音量调节HAL(四)
1、根据 device、streamType 找到 attribute、strategy、volumeCurves 音量曲线等。2、找到需要进行音量调整的通道,主要是根据 attribute、客户端 client 对应的 volumeGroup 是否一致,以及 AudioOutputDescriptor 的 device 和上层传入下来的 device 是否相同。原创 2023-06-09 13:34:25 · 1734 阅读 · 0 评论 -
Android Audio音量——音量设置(三)
前面介绍了音量调节的两种常见方法,上一篇我们分析了音量增减的代码调用流程,这里我们看一下另一个设置音量的方法 setStreamVolume()。原创 2023-11-10 15:59:17 · 484 阅读 · 0 评论 -
Android Audio音量——音量增减(二)
adjustStreamVolume()方法所需要的音量操作参数,可以在 AudioManager.java 中查看。参数值含义增加音量降低音量显示音量,但不设置静音取消静音切换静音状态1)利用设置的音频流类型 streamType 找到对应的音量状态管理类 VolumeStreamState,此类集合的音量管理的核心方法,内部有一个 map 集合保存了所有输出设备及其对应的音量等级 index,最终也是调整这个 index。原创 2023-06-09 13:29:36 · 2767 阅读 · 0 评论 -
Android Audio音量——音量调节基础(一)
前面的文章中提到过,AudioService 的主要功能之一就是负责调节音量,这一篇文章主要详细介绍一下 AudioService 中音量调节相关的知识点。原创 2023-06-09 13:26:48 · 1222 阅读 · 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 · 214 阅读 · 0 评论 -
Android Audio焦点——音频焦点策略(四)
前面的文章已经介绍了,音频焦点策略用于处理多个音频的发出声音时,各个音频播放状态的改变。如果不对音频播放那个进行管理,那么多声音将会一起发出,这样会严重影响人们的体验,因此在开发过程中,如果存在音频相关的功能,必须要吧空音频焦点策略。原创 2023-12-05 18:00:39 · 643 阅读 · 0 评论 -
Android Audio焦点——音频焦点监听(三)
其实上面的流程就是应用申请/放弃焦点的回调方法,以及应用被动失去焦点和重新获取焦点的回调流程。原创 2023-11-30 14:00:03 · 829 阅读 · 0 评论 -
Android Audio焦点——音频焦点申请(二)
前面已经介绍了音频焦点的基础,现在我们直接看一下获取、监听和释放音频焦点的相关代码。原创 2023-06-06 15:32:58 · 1615 阅读 · 0 评论 -
Android Audio焦点——音频焦点基础(一)
当您的应用需要输出音频时,应该请求音频焦点。只有在获得音频焦点后,才能开始播放。但是,在播放过程中可能无法把音频焦点一直据为己有,因为其它应用程序可以发出音频焦点的请求来抢占音频焦点,这种情况下,您的应用可以选择暂停播放或者降低音量,这样用户才能更清晰地听到其它应用程序的音频。原创 2023-06-06 13:21:00 · 801 阅读 · 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 · 827 阅读 · 0 评论 -
Android Audio基础——音频链路分析(十七)
Audacity 是一款免费的开源音频编辑和录音软件。它提供了多种功能,包括录音、剪切、复制、粘贴、混音、编辑效果等。Audacity 支持多种常见音频格式,如 MP3、WAV、AIFF 等,并且可以导入和导出这些格式的文件。使用 Audacity,用户可以轻松地录制声音,包括麦克风录音、线路输入录音和电脑音频录制。它还有一个直观的界面,可以让用户混合不同的音轨、编辑音频段落和应用各种效果,如音量调整、消音、回声、变速等。原创 2023-12-06 17:28:51 · 806 阅读 · 0 评论 -
Android Audio基础——MediaPlayer播放音频(十六)
Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack。简单来说,MediaPlayer 更加适合在后台长时间播放本地音乐文件或者在线的流式资源。SoundPool 则适合播放比较短的音频片段,比如游戏声音、按键声、铃声片段等等,它可以同时播放多个音频。而 AudioTrack 则更接近底层,提供了非常强大的控制能力,支持低延迟播放,适合流媒体和VoIP 语音电话等场景。原创 2023-06-06 17:21:26 · 2676 阅读 · 0 评论 -
Android Audio基础——AudioTrack音频控制(十五)
AudioTrack 是用于播放音频数据的类,可以使用 set 方法设置音频数据,然后使用 start 来启动播放。而 pause 和 stop 则是用于控制播放过程的方法。不管 APP 使用什么播放音频文件,最终都是由 AudioTrack 将数据传递下去。原创 2023-12-25 18:01:57 · 428 阅读 · 0 评论 -
Android Audio基础——最小缓冲区获取(十四)
在分析获取最小帧数前,我们先来了解几个相关的概念。原创 2024-05-22 09:34:23 · 639 阅读 · 0 评论 -
Android Audio基础——AudioTrack播放音频(十三)
MediaPlayer 和 AudioTrack 都是用来播放声音的,两者都提供了 java API 供应用开发者使用。其中最大的区别是 MediaPlayer 可以播放多种格式的声音文件,例如MP3、AAC、WAV、OGG、MIDI 等。而 AudioTrack 只能播放已经解码的 PCM 流。原创 2023-05-17 15:05:28 · 1285 阅读 · 0 评论 -
Android Audio基础——数据共享流程(十二)
AudioTrack 在 FIFO 中找到一块可用空间,把用户传入的音频数据写入到这块可用空间上,然后更新写位置(对于 AudioFinger 来说,意味 FIFO 上有更多的可读数据了);如果用户传入的数据量比可用空间要大,那么要把用户传入的数据拆分多次写入到 FIFO 中(AudioTrack 和 AudioFlinger 是不同的进程,AudioFlinger 同时也在不停地读取数据,所以 FIFO 可用空间是在不停变化的)。原创 2024-05-22 09:33:49 · 422 阅读 · 0 评论 -
Android Audio基础——Track构造过程(十一)
在 Android 中,Track 通常是指用于播放音频或视频的轨道或通道,用于音频流的控制。在这种语境下,AudioTrack 是用于播放音频的类之一,它提供了直接控制音频数据播放的功能。因此,可以说 AudioTrack 是 Android 中处理音频轨道的一种实现方式之一。原创 2024-05-21 08:52:54 · 292 阅读 · 0 评论 -
Android Audio基础——AudioTrack构造过程(十)
通过前面的学习我们知道 AudioTrack 是 Android 中用于播放音频的类,它提供了一种方式来直接控制音频数据的播放。通过 AudioTrack 类,你可以创建一个用于播放音频的音频流,并将音频数据写入该流中进行播放。在创建 AudioTrack 对象时,你可以指定音频流的参数,如采样率、音频格式、缓冲区大小等。通过设置这些参数,可以获得更好的音频播放效果。原创 2024-05-21 08:48:28 · 470 阅读 · 0 评论 -
Android Audio基础——AudioFlinger音频流管理(九)
源码位置:/frameworks/av/services/audioflinger/Threads.h……回放线程基类,不同输出标识的音频流对应不同类型的 PlaybackThread 实例(分为四种:MixerThread、DirectOutputThread、DuplicatingThread、OffloadThread),所有的 PlaybackThread 实例都会添加到 AudioFlinger.mPlaybackThreads 向量中。原创 2024-05-20 14:09:21 · 683 阅读 · 0 评论 -
Android Audio基础——AudioFlinger回放录制线程(八)
PlaybackThread 和 RecordThread 的基类。录制线程类,由 ThreadBase 派生。回放线程基类,同由 ThreadBase 派生。混音回放线程类,由 PlaybackThread 派生,负责处理标识为 AUDIO_OUTPUT_FLAG_PRIMARY、AUDIO_OUTPUT_FLAG_FAST、AUDIO_OUTPUT_FLAG_DEEP_BUFFER 的音频流,MixerThread 可以把多个音轨的数据混音后再输出。原创 2024-05-20 14:08:31 · 400 阅读 · 0 评论 -
Android Audio基础——音频配置xml文件加载(七)
通过前面的文章,我们知道在 AudioPolicyManager 初始化的时候回调用 loadConfig() 方法去加载 Audio 相关的配置信息,这里我们就来详细看一下。原创 2024-06-03 08:58:59 · 474 阅读 · 0 评论 -
Android Audio基础——AudioPolicyService介绍(六)
通过前面几篇文章的学习,我们也了解了音频服务初始化的大致流程,下面用一张图总结一下:经过上面的流程系统音频服务已经启动处于待命状态,如果有应用需要播放则会通过服务最终选择合适的硬件将声音播出。原创 2023-05-17 14:55:35 · 300 阅读 · 0 评论