一种安卓兼容环境的音频输出优化方法与流程

文档序号:31076145发布日期:2022-08-09 21:44阅读:159来源:国知局
一种安卓兼容环境的音频输出优化方法与流程

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


背景技术:

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


技术实现要素:

6.有鉴于此,本发明提供了一种安卓兼容环境的音频输出优化方法,能够实现安卓兼容环境内安卓应用的低延迟音频输出。
7.本发明提供的一种安卓兼容环境的音频输出优化方法,包括以下步骤:安卓应用播放音频时,构建包含安卓应用的进程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服务实例,实现音频数据的输出。
8.进一步地,所述创建采用pulseaudio client输出音频的audioflinger服务实例的过程为:启动新的audioflinger服务,并将进程id及线程id设置为该服务的成员变量;在创建track时创建directoutputthread线程,且采用pulseaudio client api实现音频设备打开和读写操作。
9.进一步地,所述安卓应用创建audiotrack时,根据audiotrack的类型为新建的audiotrack关联audioflinger服务实例的过程为:若audiotrack的类型为音乐声音audio_stream_music,则根据进程id及线程id获取audioflinger服务实例,并将获取到的audioflinger服务实例关联到audiotrack,实现音频数据的输出;否则获取安卓兼容环境中的audioflinger服务实例,再将获取到的audioflinger服务实例关联到audiotrack。
10.进一步地,所述audioflinger服务实例列表是类型为map《string, iaudioflinger》的列表,iaudioflinger为iaudioflinger接口实例,string为由进程id及线程id组成的字符串。
11.有益效果:本发明通过在安卓应用播放音频时根据音频文件的类型为安卓应用获取或创建audioflinger服务实例,从而实现了为播放音乐声音的安卓应用分配固定的audioflinger服务实例,audioflinger服务实例采用pulseaudio客户端的方式将音频数据传输至pulseaudio server,由pulseaudio server完成混音操作,因此有效提高了安卓应用音频输出的效率,降低了音频输出的延迟。
附图说明
12.图1为本发明提供的一种安卓兼容环境的音频输出优化方法的流程图。
具体实施方式
13.下面结合附图并举实施例,对本发明进行详细描述。
14.本发明提供的一种安卓兼容环境的音频输出优化方法,其核心思想是:在安卓兼容环境内实现多个audioflinger,每个产生音频流输入的安卓应用关联一个audioflinger,audioflinger内直接使用pulseaudio client api将音频输出到pulseaudio server,从而实现将多个音频流输入映射到不同的pulseaudio client仅由
pulseaudio server进行混音。
15.本发明提供的一种安卓兼容环境的音频输出优化方法,流程如图1所示,包括以下步骤:当安卓兼容环境的安卓应用播放音频时,获取安卓应用的进程id及线程id,构建包含进程id及线程id的audioflinger服务实例名称,例如,media.audio_flinger.processid. threadid,并向安卓兼容环境发送包含audioflinger服务实例名称的audioflinger服务注册请求;安卓兼容环境的系统应用播放音频时,audioflinger服务实例名称为不含进程id及线程id的audioflinger服务实例名称,例如,media.audio_flinger,再向安卓兼容环境发送包含audioflinger服务实例名称的audioflinger服务注册请求;监测安卓兼容环境中的audioflinger服务注册请求,若audioflinger服务注册请求中audioflinger服务实例名称内未包含进程id及线程id,则令进程id及线程id均为特定值,以进程id及线程id查找audioflinger服务实例列表,如果列表中存在相应的服务实例则返回该服务实例,否则获取安卓兼容环境中的audioflinger服务实例,并将设定的进程id、线程id及audioflinger服务实例添加到audioflinger服务实例列表中;若audioflinger服务注册请求中audioflinger服务实例名称包含进程id及线程id,则以进程id及线程id查找audioflinger服务实例列表,如果列表中存在相应的audioflinger服务实例则返回该服务实例,否则创建新的audioflinger服务实例,并将audioflinger服务实例名称中的进程id、线程id及新的audioflinger服务实例添加到audioflinger服务实例列表中;其中,audioflinger服务实例列表,用于保存进程id及线程id与audioflinger服务实例之间的映射关系;当安卓应用创建audiotrack时,根据audiotrack的类型为新建的audiotrack关联audioflinger服务实例:若audiotrack的类型为音乐声音audio_stream_music,则根据进程id及线程id获取audioflinger服务实例,并将获取到的audioflinger服务实例关联到audiotrack,实现音频数据的输出;否则获取安卓兼容环境中的audioflinger服务实例,再将获取到的audioflinger服务实例关联到audiotrack,实现音频数据的输出;其中,创建新的audioflinger服务实例的过程为:启动新的audioflinger服务,并将进程id及线程id设置为该服务的成员变量;在创建track时创建directoutputthread线程,且采用pulseaudio client api实现音频设备打开和读写操作。
16.实施例:本实施例通过对安卓系统进行系统级的修改实现了本发明提供的一种安卓兼容环境的音频输出优化方法,包括以下步骤:s1、当安卓兼容环境的安卓应用播放音频时,获取安卓应用的processid和threadid,构建包含进程id及线程id的audioflinger服务实例名称,并向安卓兼容环境发送包含audioflinger服务实例名称的audioflinger服务注册请求;安卓兼容环境的系统应用播放音频时,audioflinger服务实例名称为不含进程id及线程id的audioflinger服务实例名称,再向安卓兼容环境发送包含audioflinger服务实例名称的audioflinger服务注册请求。
17.s2、监测安卓兼容环境中的audioflinger服务注册请求,若audioflinger服务注册请求中audioflinger服务实例名称内未包含进程id及线程id则执行s3,若audioflinger服务注册请求中audioflinger服务实例名称内包含进程id及线程id则执行s4。
18.s3、令进程id及线程id均为特定值,以进程id及线程id查找audioflinger服务实例列表,如果列表中存在相应的服务实例则返回该服务实例,否则获取安卓兼容环境中的audioflinger服务实例,并将设定的进程id、线程id及audioflinger服务实例添加到audioflinger服务实例列表中,执行s5。
19.具体来说,当audioflinger服务实例名称内未包含进程id及线程id时,获取audioflinger服务的iaudioflinger接口作为audioflinger服务实例;再执行注册服务函数的其他操作。若audioflinger服务实例名称内未包含进程id及线程id则说明该安卓应用为系统安卓应用,由于安卓系统本身只会创建一个audioflinger服务,因此获取该audioflinger服务的接口执行音频输出的操作即可。
20.其中,audioflinger服务实例列表,用于保存进程id及线程id与audioflinger服务实例之间的映射关系。audioflinger服务实例列表(maudioflingerlist)的类型为map《string, iaudioflinger》的列表,用于将“processid.threadid”组成的字符串映射到iaudioflinger接口实例。
21.在获取到iaudioflinger接口实例后,令进程id及线程id均为特定值,如对应的string= integer.tostring(-1)+“.”+ integer.tostring(-1),即对应的processid和threadid均为-1,再将processid、threadid与iaudioflinger接口实例添加到maudioflingerlist中。
22.s4、以processid和threadid查找audioflinger服务实例列表,如果列表中存在相应的audioflinger服务实例则返回该服务实例,否则创建新的audioflinger服务实例,并将设定的processid、threadid及新的audioflinger服务实例添加到audioflinger服务实例列表中。包括以下步骤:提取audioflinger服务实例名称中包含的processid和threadid,构建字符串“processid.threadid”,在maudioflingerlist中根据“processid.threadid”查找,若存在匹配项则返回对应的iaudioflinger实例;若不存在匹配项则启动一个新的audioflinger服务,并将该服务的mprocessid和mthreadid成员分别设置为processid和threadid,再将新创建的audioflinger服务的iaudioflinger接口实例和对应的processid和threadid加入maudioflingerlist中,并返回对应的iaudioflinger接口实例;再执行函数的安卓标准步骤。
23.进一步地,通过修改安卓框架中的servicemanager中与服务的注册功能相关的函数实现创建audioflinger服务实例,例如:对do_add_service函数进行修改。
24.此外,本实施例中增加了注销audioflinger的接口unregisteraudiotrack,接口的参数为processid和threadid,接口操作为:构建字符串“processid.threadid”,在maudioflingerlist中根据“processid.threadid”查找,如存在匹配项,则停止匹配项对应的服务实例,并将该服务实例从maudioflingerlist中移除。
25.创建新的audioflinger服务实例的过程通过 修改audioflinger实现:在audioflinger类中增加两个长整型成员变量mprocessid和mthreadid,初始值均设置为-1;
在audioflinger的createtrack方法中,将创建mixerthread修改为创建directoutputthread;将audioflinger的音频设备打开和读写操作,均修改为采用pulseaudio client api的相关函数实现。
26.s5、修改安卓框架中的audiosystem类的get_audio_flinger方法,实现当安卓应用创建audiotrack时,根据audiotrack的类型为新建的audiotrack关联audioflinger服务实例,完成安卓应用音频的输出。
27.audiosystem类属于libaudioclient模块,运行于音频播放应用内。在get_audio_flinger方法中增加两个长整形参数processid和threadid,参数的默认值为-1。其中,设置默认值的目的是能够兼容现有安卓代码。
28.构建audioflinger的服务实例名称,将processid和threadid转换为字符串附加到服务名称后,即media.audio_flinger.processid. threadid;通过defaultservicemanager获取接口iservicemanager;再根据audiotrack类型,执行以下步骤:如类型为audio_stream_music,则调用iservicemanager的getservicegetservice(“media.audio_flinger.processid. threadid”)以获取和processid/ threadid绑定的audioflinger实例,否则,则调用iservicemanager的getservicegetservice(“media.audio_flinger”)以获取系统启动的第一个audioflinger实例;执行get_audio_flinger的安卓标准实现步骤。
29.此外,通过修改安卓框架中的audiotrack类的createtrack方法实现以下操作:调用audiosystem::get_audio_flinger方法获取audioflinger服务时,传入当前processid和threadid,以将这两个参数传递到servicemanager找到audioflinger实例,再由audioflinger实例创建track;执行createtrack的安卓标准实现步骤。
30.综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1