AudioTrack中MODE_STATIC和MODE_STREAM的差异

项目在跑自动化测试的时候出现了ANR,分析看到是同步方法中一直在等待创建AudioTrack,在系统平台的同事分下,AudioTrack创建失败,一直没有返回,所以客户端这边

一直等待导致ANR了,系统平台同事让我把AudioTrack的模式从MODE_STATIC修改为MODE_STREAM。

这边对AudioTrack方法简单说下:

1.mode

AudioTrack中有MODE_STATIC和MODE_STREAM两种分类。STREAM的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中。这个和我们在socket中发送数据一样,应用层从某个地方获取数据,例如通过编解码得到PCM数据,然后write到audiotrack。

这种方式的坏处就是总是在JAVA层和Native层交互,效率损失较大。适用于大多数的场景,将audio buffers从java层传递到native层即返回。如果audio buffers占用内存多,应该使用MODE_STREAM。比如播放时间很长的声音文件,比如音频文件使用高采样率,比如动态的处理audio buffer等。

而STATIC的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,后续就不用一次次得write了。一次性将全部的音频资源从java传递到native层,AudioTrack会自己播放这个buffer中的数据。,音频文件短且占用内存小。适用于短促的游戏音效,并且对播放延迟真的有很高要求。另外源码中有frame和frameCount的概念:一个frame的大小就是声道数×采样大小。frameCount就是buffer中能放的frame的个数。

这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。

2.StreamType

这个在构造AudioTrack的第一个参数中使用。这个参数和Android中的AudioManager有关系,涉及到手机上的音频管理策略。
Android将系统的声音分为以下几类常见的:

STREAM_ALARM:警告声
STREAM_MUSCI:音乐声,例如music等
STREAM_RING:铃声
STREAM_SYSTEM:系统声音
STREAM_VOCIE_CALL:电话声音

以前在台式机上开发的时候很少知道有这么多的声音类型,不过仔细思考下,发现这样做是有道理的。例如你在听music的时候接到电话,这个时候music播放肯定会停止,此时你只能听到电话,如果你调节音量的话,这个调节肯定只对电话起作用。当电话打完了,再回到music,你肯定不用再调节音量了。

其实系统将这几种声音的数据分开管理,所以,这个参数对AudioTrack来说,它的含义就是告诉系统,我现在想使用的是哪种类型的声音,这样系统就可以对应管理他们了。

代码里首先获取最小的分配内存,然后创建AudioTrack,最后通过mAudioTrack.write(data, offset, length);将音频数据进行播放。

上一篇:Matlab仿真——改进的MUSIC算法


下一篇:对象转换数组