Android音频系统AudioTrack使用方法详解
今天,简单讲讲audiotrack的使用方法。
1、android audiotrack简介
在android中播放声音可以用mediaplayer和audiotrack两种方案的,但是两种方案是有很大区别的,mediaplayer可以播放多种格式的声音文件,例如mp3,aac,wav,ogg,midi等。而audiotrack只能播放pcm数据流。
事实上,两种本质上是没啥区别的,mediaplayer在播放音频时,在framework层还是会创建audiotrack,把解码后的pcm数流传递给audiotrack,最后由audioflinger进行混音,传递音频给硬件播放出来。利用audiotrack播放只是跳过mediaplayer的解码部分而已。mediaplayer的解码核心部分是基于opencore 来实现的,支持通用的音视频和图像格式,codec使用的是openmax接口来进行扩展。因此使用audiotrack播放mp3文件的话,要自己加入一个音频解码器,如libmad。否则只能播放pcm数据,如大多数wav格式的音频文件。
如果是实时的音频数据,那么只能用audiotrack进行播放。
2、如何使用audiotrack进行音频播放
//根据采样率,采样精度,单双声道来得到frame的大小。 int bufsize = audiotrack.getminbuffersize(8000,//每秒8k个点 audioformat.channel_configuration_stereo,//双声道 audioformat.encoding_pcm_16bit);//一个采样点16比特-2个字节 //注意,按照数字音频的知识,这个算出来的是一秒钟buffer的大小。 //创建audiotrack audiotrack trackplayer = new audiotrack(audiomanager.stream_music, 8000, audioformat.channel_configuration_ stereo, audioformat.encoding_pcm_16bit, bufsize, audiotrack.mode_stream);// trackplayer.play() ;//开始 trackplayer.write(bytes_pkg, 0, bytes_pkg.length) ;//往track中写数据 …. trackplayer.stop();//停止播放 trackplayer.release();//释放底层资源。
这里需要解释下两个东西:
1.audiotrack.mode_stream:
audiotrack中有mode_static和mode_stream两种分类。stream的意思是由用户在应用程序通过write方式把数据一次一次得写到audiotrack中。这个和我们在socket中发送数据一样,应用层从某个地方获取数据,例如通过编解码得到pcm数据,然后write到audiotrack。
这种方式的坏处就是总是在java层和native层交互,效率损失较大。
而static的意思是一开始创建的时候,就把音频数据放到一个固定的buffer,然后直接传给audiotrack,后续就不用一次次得write了。audiotrack会自己播放这个buffer中的数据。
这种方法对于铃声等内存占用较小,延时要求较高的声音来说很适用。
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);将音频数据进行播放。
android音频系统之audiotrack的使用就讲完了。
就这么简单。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android RecyclerView使用方法详解
-
Android时间对话框使用方法详解
-
Android垂直滚动控件ScrollView使用方法详解
-
Android进度条控件progressbar使用方法详解
-
Android ExpandableRecyclerView使用方法详解
-
Android音频系统AudioTrack使用方法详解
-
Android开发教程之Fragment定义、创建与使用方法详解【包含Activity通讯,事务执行等】
-
Android学习之本地广播使用方法详解
-
Android AsyncTask详解及使用方法
-
Android中ToggleButton开关状态按钮控件使用方法详解