一种安卓兼容环境的音频输出优化方法技术

技术编号:34496006 阅读:16 留言:0更新日期:2022-08-10 09:15
本发明专利技术公开了一种安卓兼容环境的音频输出优化方法,通过在安卓应用播放音频时根据音频文件的类型为安卓应用获取或创建AudioFlinger服务实例,从而实现了为播放音乐声音的安卓应用分配固定的AudioFlinger服务实例,AudioFlinger服务实例采用PulseAudio客户端的方式将音频数据传输至PulseAudio Server,由PulseAudio Server完成混音操作,因此有效提高了安卓应用音频输出的效率,降低了音频输出的延迟。音频输出的延迟。音频输出的延迟。

【技术实现步骤摘要】
一种安卓兼容环境的音频输出优化方法


[0001]本专利技术属于桌面操作系统上运行移动应用的开发
,具体涉及一种安卓兼容环境的音频输出优化方法。

技术介绍

[0002]Audio是安卓系统非常重要的组成部分,负责音频数据的采集和输出、音频流的控制、音频设备的管理及音量调节等,主要包括音频应用框架(Audio Application Framework)、音频本地框架(Audio Native Framework)、音频服务(Audio Services)和音频硬件抽象层(Audio HAL)。此外,与 Audio 强相关的有 MultiMedia,MultiMedia 负责音视频的编解码,MultiMedia 将解码后的数据通过 AudioTrack 输出,而 AudioRecord 采集的录音数据交由 MultiMedia 进行编码。
[0003]一般情况下,安卓系统中安卓应用播放音频可采用MediaPlayer 和 AudioTrack。其中,MediaPlayer支持播放多种格式的音源,如:mp3、flac、wma、ogg、wav等,MediaPlayer的实现过程中先在 Native 层创建对应的音频解码器和AudioTrack,并将由音频解码器解码后的数据交由AudioTrack进行输出,由此可见,MediaPlayer的应用场景更广使用也更方便。AudioTrack仅支持播放解码后的 PCM 数据流,通常在对声音时延要求非常苛刻的应用场景才需要用到AudioTrack。
[0004]安卓系统中安卓应用播放音频的过程为:MediaPlayer解析音频文件格式,然后调用解码器生成PCM格式音频数据,再将PCM音频数据传输给AudioTrack;AudioTrack将音频数据传输给AudioFlinger;AudioFlinger混音后调用音频设备的HAL接口,由音频设备的HAL接口操作音频设备输出音频。
[0005]现有安卓兼容环境xDroid的音频输出架构修改了音频设备的HAL层代码,具体为采用PulseAudio的Client API重新实现了安卓环境内的音频HAL设备,安卓兼容环境内的音频HAL设备处理的是来自AudioFlinger的音频流。然而,AudioFlinger位于安卓兼容环境中负责混音,同时,位于Linux端的PulseAudio Server也负责混音,这就导致输出音频的过程中实际执行了两次混音操作,即安卓兼容环境中的AudioFlinger及Linux端的PulseAudio Server各执行了一次混音,增加了音频输出的延迟,尤其是AudioFlinger内的混音是由单独的线程异步实现的具有较高的延迟进一步增大了音频输出的延迟。

技术实现思路

[0006]有鉴于此,本专利技术提供了一种安卓兼容环境的音频输出优化方法,能够实现安卓兼容环境内安卓应用的低延迟音频输出。
[0007]本专利技术提供的一种安卓兼容环境的音频输出优化方法,包括以下步骤:安卓应用播放音频时,构建包含安卓应用的进程ID及线程ID的 AudioFlinger服务实例名称,向安卓兼容环境发送包含AudioFlinger服务实例名称的AudioFlinger服务注册请求;
监测AudioFlinger服务注册请求,若其中的AudioFlinger服务实例名称未包含进程ID及线程ID,则令进程ID及线程ID均为特定值,若AudioFlinger服务实例列表中存在具有相同进程ID及线程ID的服务实例则返回该服务实例;否则获取AudioFlinger服务实例,将设定的进程ID、线程ID及AudioFlinger服务实例添加到AudioFlinger服务实例列表中;若包含进程ID及线程ID,且AudioFlinger服务实例列表中存在具有相同进程ID及线程ID的服务实例则返回该服务实例,否则创建采用PulseAudio Client输出音频的AudioFlinger服务实例,将包含的进程ID、线程ID及AudioFlinger服务实例添加到AudioFlinger服务实例列表中;所述AudioFlinger服务实例列表用于保存进程ID及线程ID与AudioFlinger服务实例之间的映射关系;安卓应用创建AudioTrack时,根据AudioTrack的类型为新建的AudioTrack关联AudioFlinger服务实例,实现音频数据的输出。
[0008]进一步地,所述创建采用PulseAudio Client输出音频的AudioFlinger服务实例的过程为:启动新的AudioFlinger服务,并将进程ID及线程ID设置为该服务的成员变量;在创建Track时创建DirectOutputThread线程,且采用PulseAudio Client API实现音频设备打开和读写操作。
[0009]进一步地,所述安卓应用创建AudioTrack时,根据AudioTrack的类型为新建的AudioTrack关联AudioFlinger服务实例的过程为:若AudioTrack的类型为音乐声音AUDIO_STREAM_MUSIC,则根据进程ID及线程ID获取AudioFlinger服务实例,并将获取到的AudioFlinger服务实例关联到AudioTrack,实现音频数据的输出;否则获取安卓兼容环境中的AudioFlinger服务实例,再将获取到的AudioFlinger服务实例关联到AudioTrack。
[0010]进一步地,所述AudioFlinger服务实例列表是类型为Map<String, IAudioFlinger>的列表,IAudioFlinger为IAudioFlinger接口实例,String为由进程ID及线程ID组成的字符串。
[0011]有益效果:本专利技术通过在安卓应用播放音频时根据音频文件的类型为安卓应用获取或创建AudioFlinger服务实例,从而实现了为播放音乐声音的安卓应用分配固定的AudioFlinger服务实例,AudioFlinger服务实例采用PulseAudio客户端的方式将音频数据传输至PulseAudio Server,由PulseAudio Server完成混音操作,因此有效提高了安卓应用音频输出的效率,降低了音频输出的延迟。
附图说明
[0012]图1为本专利技术提供的一种安卓兼容环境的音频输出优化方法的流程图。
具体实施方式
[0013]下面结合附图并举实施例,对本专利技术进行详细描述。
[0014]本专利技术提供的一种安卓兼容环境的音频输出优化方法,其核心思想是:在安卓兼容环境内实现多个AudioFlinger,每个产生音频流输入的安卓应用关联一个AudioFlinger,AudioFlinger内直接使用PulseAudio Client API将音频输出到PulseAudio Server,从而实现将多个音频流输入映射到不同的PulseAudio Client仅由
Pul本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种安卓兼容环境的音频输出优化方法,其特征在于,包括以下步骤:安卓应用播放音频时,构建包含安卓应用的进程ID及线程ID的 AudioFlinger服务实例名称,向安卓兼容环境发送包含AudioFlinger服务实例名称的AudioFlinger服务注册请求;监测AudioFlinger服务注册请求,若其中的AudioFlinger服务实例名称未包含进程ID及线程ID,则令进程ID及线程ID均为特定值,若AudioFlinger服务实例列表中存在具有相同进程ID及线程ID的服务实例则返回该服务实例;否则获取AudioFlinger服务实例,将设定的进程ID、线程ID及AudioFlinger服务实例添加到AudioFlinger服务实例列表中;若包含进程ID及线程ID,且AudioFlinger服务实例列表中存在具有相同进程ID及线程ID的服务实例则返回该服务实例,否则创建采用PulseAudio Client输出音频的AudioFlinger服务实例,将包含的进程ID、线程ID及AudioFlinger服务实例添加到AudioFlinger服务实例列表中;所述AudioFlinger服务实例列表用于保存进程ID及线程ID与AudioFlinger服务实例之间的映射关系;安卓应用创建AudioTrack时,根据AudioTrack的类型为新建的AudioTrack关联AudioFlinger服务实例,实现音频数据的输出。2....

【专利技术属性】
技术研发人员:温研
申请(专利权)人:北京麟卓信息科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1