本申请涉及android系统技术,特别涉及一种android系统中的音频播放方法。

背景技术:

在android系统中,现有的使用audiotrack进行音频播放时,audiotrack应用与android系统平台的交互过程如图1所示,在图1中,minbuffer是android平台api返回值,告知应用当前需要配置给android平台的最小缓存数;trackbuffer为应用最终设置给平台的缓存数,需要保证trackbuffer>=minbuffer;write为应用向平台缓存中写数据,内部维护的已写数量总和;play是android平台api返回值,告知当前的播放进度;x是android平台内部的缓存,应用无法感知,对不同终端该值不同,需要缓存量大于x时才真正开始播放。

基于上述交互过程实现的音频播放流程具体包括:

1)应用在播放配置阶段创建audiotrack时,为audiotrack设置buffer大小为trackbuffer,为了能够正常播放,通常trackbuffer≥minbuffer;

2)在启动播放阶段,应用向trackbuffer中持续写入数据,当trackbuffer被填满后audiotrack开始播放;

3)在稳态播放过程中,当存在一帧待播放的音频数据时,应用记录已经送给平台的音频数write,同时不断通过api获取平台的播放进度play,判断如下:

a)若write–play≥trackbuffer,则认为平台的缓存已满,不作处理;

b)若write–play

4)判断若还存在待播放的音频数据,则继续执行步骤3,否则等待有新数据时再执行步骤3。

上述音频播放方式存在如下两个问题:

1、对于某些终端,当应用已经给audiotrack的buffer填充满trackbuffer数据后,android平台api返回的播放进度play并不改变,导致音频不能正常播放;其原因可能是android平台底层的audioflinger还未真正启动播放,还需要trackbuffer中的数据达到一定的缓存量x后才开始播放。为了trackbuffer被填满后,能够真正的启动播放,通常将该buffer值设定的很大,让其大于audioflinger层真正启动播放需要的缓存量x。但是x的实际值对应用并不可见,只能针对不同终端去猜测x的大小。且如果为了保证能够正常播放而配置更大的trackbuffer量,则填充trackbuffer的时间会随之增长,势必会导致流媒体播放的用户面时延增大;

2、使用android平台进行音频播放过程中如果连接蓝牙播放设备,可能导致音频无法继续播放。具体地,使用蓝牙设备进行音频播放时,audiotrack需要的缓存量较大,通常大于使用android设备自身喇叭播放时需要的trackbuffer值。因此,当连接上蓝牙设备后,原先设给android平台的缓存量不能满足蓝牙设备的播放。连接蓝牙设备进行音频播放所需的缓存量大小对应用不可见,且不同蓝牙设备的缓存需求量不同。如果为了保证能够正常播放而配置更大的trackbuffer量,则填充trackbuffer的时间会随之增长,势必会导致流媒体播放的用户面时延增大。

技术实现要素:

本申请提供一种android系统中的音频播放方法,能够减小音频播放的时延。

为实现上述目的,本申请采用如下技术方案:

一种android系统中的音频播放方法,包括:

在播放配置阶段,将android平台的trackbuffer设为minbuffer;其中,minbuffer为android平台当前需要的最小缓存数;

应用识别android平台的播放状态;

当所述播放状态为未播放时,继续向缓存写入音频数据;当所述播放状态为播放时,播放缓存中的音频数据。

较佳地,所述应用识别android平台的播放状态包括:

当所述应用从播放配置阶段刚进入启动播放阶段的初始场景下,所述播放状态为未播放;和/或,

在预设的第一时间段内播放进度值没有更新,则确定所述播放状态为未播放;和/或,

连续n次向trackbuffer写入数据的间隔时间大于预设的第二时间段,则确定所述播放状态为未播放;和/或,

连续m次接收android平台反馈的播放进度值不同,则确定所述播放状态为播放;其中,所述n和m为预设的正整数。

较佳地,该方法进一步包括:当所述播放状态为播放时,如果连续x次出现写入数据耗时超过预设的第三时间段,将缓存中剩余未播放数据量重设为trackbuffer;其中,x为预设的正整数。

由上述技术方案可见,在播放配置阶段,将android平台的trackbuffer设为minbuffer;应用识别android平台的播放状态;当所述播放状态为未播放时,若缓存中剩余的未播放数据大于或等于预先配置的trackbuffer,仍继续向缓存写入音频数据,以驱动android平台进入播放状态;当所述播放状态为播放时,按照图1方式播放缓存中的音频数据。通过上述方式,不需要在配置阶段将trackbuffer设置的过大,仍然能够保证音频的正常播放,从而减小了音频播放启动的时延。

附图说明

图1为现有的audiotrack应用与android系统平台的交互过程示意图;

图2为本申请实施例中音频播放方法的具体流程示意图。

具体实施方式

为了使本申请的目的、技术手段和优点更加清楚明白,以下结合附图对本申请做进一步详细说明。

如背景技术所述,为了使android的音频正常播放,需要保证初始阶段android平台缓存的数据量能够达到x。通常的方式是将trackbuffer设置的比较大,使得trackbuffer大于x。然而这种方式可能会导致音频播放的延时较大。

本申请中为避免出现音频播放延时过大的问题,提供一种音频播放方法。该方法具体包括:

在播放配置阶段,将android平台的trackbuffer设为minbuffer;接下来在音频播放阶段,应用识别android平台的播放状态;当播放状态为未播放时,若缓存中剩余的未播放数据大于或等于预先配置的trackbuffer,则表明设置的trackbuffer可能小于播放音频的最低缓存量x,这时,本申请中将继续向缓存写入音频数据,使缓存内部的数据量大于x,以触发音频播放;当播放状态为播放时,仍然按照现有的方式控制播放缓存中的音频数据。

在上述处理中,新增了应用对平台播放状态的识别机制,其中,判断平台播放状态的机制具体包括:

1)在以下场景时,判断平台播放状态为“未播放”的场景:

a.初始场景,即应用刚刚从“播放配置”阶段进入“启动播放”阶段;

b.连续预设的第一时间段内播放进度play都不更新,如:每隔100ms判断一次,连续三次查询时,播放进度都没更新则可认为平台没有播放;

c.连续n次向trackbuffer中填充数据的间隔时间过长,例如大于预设的第二时间段。

2)在以下场景时,判断平台播放状态为“播放”的场景:

a.连续m次平台返回的播放进度play不一样。

上述即为应用判断平台播放状态的具体方式。

优化后应用根据平台的播放状态的数据处理机制为:

1)若平台为未播放状态:

a.当write–play

b.当write–play≥trackbuffer时,强行执行写入动作。

2)若平台为播放状态:

a.音频播放相关的处理同原有的播放机制。

b.为了增强方案健壮性,在播放状态下,如果连续x次出现写入数据耗时大于预设的第三时间段,则认为平台缓存已满,强制令write–play=trackbuffer,即认为audiotrack的可用缓存为0,避免下次继续执行数据写入耗时过长。

下面通过一个具体实施例说明本申请的具体实现。图2为本申请实施例中音频播放方法的具体流程图。该实施例是在专网终端上实现的。如图2所示,该方法包括:

步骤201,在播放配置阶段,将android平台的trackbuffer设为minbuffer,并开始向audiotrack中写入数据。

本实施例中,假定在播放配置阶段,将android平台的trackbuffer设为minbuffer。

步骤202,识别平台播放状态。

步骤203,判断播放状态是否为播放,若否,则执行步骤204,若是,执行步骤205。

本实施例中,假定获取到的minbuffer为640字节,则trackbuffer也设置为640字节。当缓存量达到trackbuffer大小时,音频并不会开始播放,因为平台要求960字节以上才能启动播放。那么在缓存量达到640字节后,判断播放状态为未播放,则执行步骤204。

步骤204,强行向平台写入音频数据。

通过播放进度判决android平台为“未播放”状态,开始强行向audiotrack中写入数据。继续强行写入320字节后,android平台真正开始音频播放,app根据播放进度更新平台为“播放”状态。

步骤205,将平台状态标记为“播放”,按照现有方式播放音频。

在android平台的“播放”状态下,app按照原有播放机制进行音频播放直到播放结束。

步骤206,判断平台是否有空余缓存,若是,则执行步骤207,否则,返回步骤202。

步骤207,判断距离上一次平台写入数据时间是否超过设定的时间段,若是,则执行步骤204,否则,执行步骤208。

如果在“播放”状态下平台长时间没有可播放的数据,app会再次判决平台为“未播放”状态,再次播放数据时将重复业务开始时的流程,再次触发强写机制。

步骤208,向平台写入音频数据。

步骤209,判断多次写入耗时是否过长(例如大于8ms),若是,则执行步骤210,否则返回步骤202。

当多次写入耗时过长时,认为平台缓存已满,通过步骤210将可用缓存设为0,继续判断平台播放状态。

步骤210,将平台剩余缓存空间设为0。

上述即为本实施例中的音频播放方法的具体实现。

通过上述本申请中的音频播放方法,能够降低在android系统中播放流媒体音频时的耗时,对于用户面时延要求高的场景,该方案能够带来较为显著的时延优化效果;另外,对于某些android终端,在音频播放过程中切换为蓝牙播放后就无声的问题可以得到解决。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。

android 音频播放过程,一种Android系统中的音频播放方法与流程相关推荐

  1. linux查看磁盘对应槽位,一种linux系统硬盘槽位识别方法与流程

    技术领域 本发明涉及计算机技术领域,尤具体地说是一种实用性强.linux系统硬盘槽位识别方法. 背景技术: 近年来,随着技术的迅速发展,linux系统的应用也越来越广泛,特别对于国产处理器,linux ...

  2. matlab截视频人脸,一种视频图像中人脸图像截取方法与流程

    本发明涉及人工智能领域,具体涉及一种提高人脸比对性能的视频图像中人脸图片截取方法. 背景技术: 人脸图像比对需要对人脸图像提取特征数据,用于人脸对比的人脸特征提取,主要是对经人脸检测过程截取到的视频图 ...

  3. 在嵌入在html中的pdf电子签章,一种网页PDF中电子签章定位方法与流程

    本发明属于一种电子签章技术领域,具体涉及一种网页PDF中电子签章定位方法. 背景技术: 国密电子签章中的套章方法操作复杂,无法对电子文档中一次性加盖多个印章的,大大降低了盖章效率,尤其是无法在所有需要 ...

  4. Android电视开机倒计时,一种智能电视开机视频的倒计时方法与流程

    本发明涉及智能电视领域,尤其涉及一种智能电视开机视频的倒计时方法. 背景技术: 当前智能电视厂商为了提高智能电视广告的带来利润,大都会在智能电视开机过程中内嵌开机视频广告,但是有时广告时间长有时广告时 ...

  5. iOS系统中应用程序间通信的方法及装置

    申请号 :CN 201210548391 申请时间 : 2101.12.17 申请人 : 北京奇虎科技有限公司 [摘要] 本发明公开了iOS系统中应用程序间通信的方法及装置,用于在当前应用程序与目标应 ...

  6. 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程

    本发明涉及通信技术领域,具体涉及一种网络传输中实时音频数据丢包恢复的方法. 背景技术: 随着通信技术的发展,音频传输系统对实时性和准确性的要求越来越高.在网络的音频传输过程中,影响音频音质的主要因素是 ...

  7. lte同步信号 matlab,一种TD-LTE系统下行辅同步信号检测方法

    摘 要: 基于相干检测和使用部分相关的非相干检测,提出了一种适用于TD-LTE系统下行辅同步信号SSS(Secondary Synchronization Signal) 的检测方法.根据SSS索引号 ...

  8. linux物理内存地址与iomem,一种Linux系统物理内存镜像文件分析方法_4

    模块信息,如图7所示,给出了本发明的实施例中 模块结构关系图,modules变量指向某一个已加载模块结构体module地址,所有已加载模 块其module形成一个双向链表,如图7所示,据此可以获取到所 ...

  9. 双系统中ubuntu的安装方法

    双系统中ubuntu的安装方法 注意:给电脑安装双系统时,一定要先装Windows系统,再安装Linux系统! 原因是电脑开机后,要先执行一段bootloader引导程序:再由引导程序启动操作系统.W ...

最新文章

  1. 检验xpath的小妙招
  2. mysql主从脚本_shell脚本部署mysql主从
  3. HDU - 5667 Sequence(矩阵快速幂+费马小定理降幂)
  4. mysql分表 查询 优化_MySQL性能管理及架构(查询优化、分库分表)一遍文章搞定...
  5. 面试:高并发下的流量控制
  6. 外虚内实是什么意思_广东潮州“茶”文化浓厚,为什么“工夫茶”常被谬传“功夫茶”?...
  7. spring cloud bus_Spring Cloud学习笔记--消息总线(Bus)
  8. 用python画漂亮图-使用 Python/matplotlib 画出漂亮的论文插图
  9. 行为驱动开发BDD和Cucunber简介
  10. Xamarin 打包生成 Android apk 文件
  11. 掘金小册大众评审团流程
  12. Oracle定时任务使用
  13. 重置计算机的本地策略,手把手教你win10系统本地组策略重置恢复默认的详细方案...
  14. java课题研究方法和技术途径_开题报告中的拟采取的研究方法技术路线和技术关键...
  15. C语言使用文件指针时遇到的位置问题
  16. 一元线性模型的中位数回归
  17. 罗永浩当年求职新东方一万多字的求职信
  18. pythonurllib新浪微博_定向爬虫 - Python模拟新浪微博登录
  19. 中医大2020年7月网考计算机应用基础,2020年7月网络教育统考计算机应用基础模拟题试卷9...
  20. Layui(四) 表格嵌套下拉列表框

热门文章

  1. 研究B站视频编号含义 - av | ep | md ...
  2. Android6.0权限
  3. win10安装win7虚拟机记录
  4. Python二级(04)——Python语言基本语法元素
  5. win7 64位 SEC S3C2410X Test B/D安装
  6. java 实现 ppt或pptx文件转换PDF文件 -- poi
  7. Google Chrome 源码下载
  8. 安兔兔 android 4.4,适配智能电视 安兔兔评测V4.4.3发布
  9. Lucene .Net + 盘古分词 学习资料
  10. 在国外期刊发表文章时一定用到的,SCI论文写法攻略