还有一篇:http://blog.51cto.com/13591594/2068009 (其项目地址: https://github.com/979451341/Audio-and-video-learning-materials )android
今天,简单讲讲AudioTrack的使用方法。git
一、Android AudioTrack简介github
在android中播放声音能够用MediaPlayer和AudioTrack两种方案的,可是两种方案是有很大区别的,MediaPlayer能够播放多种格式的声音文件,例如MP3,AAC,WAV,OGG,MIDI等。而AudioTrack只能播放PCM数据流。socket
事实上,两种本质上是没啥区别的,MediaPlayer在播放音频时,在framework层仍是会建立AudioTrack,把解码后的PCM数流传递给AudioTrack,最后由AudioFlinger进行混音,传递音频给硬件播放出来。利用AudioTrack播放只是跳过Mediaplayer的解码部分而已。Mediaplayer的解码核心部分是基于OpenCORE 来实现的,支持通用的音视频和图像格式,codec使用的是OpenMAX接口来进行扩展。所以使用audiotrack播放mp3文件的话,要本身加入一个音频解码qi,如libmad。不然只能播放PCM数据,如大多数WAV格式的音频文件。ide
若是是实时的音频数据,那么只能用AudioTrack进行播放。学习
二、如何使用AudioTrack进行音频播放code
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 //根据采样率,采样精度,单双声道来获得frame的大小。
int bufsize = AudioTrack.getMinBufferSize(8000,//每秒8K个点
AudioFormat.CHANNEL_CONFIGURATION_STEREO,//双声道 AudioFormat.ENCODING_PCM_16BIT);//一个采样点16比特-2个字节orm
//注意,按照数字音频的知识,这个算出来的是一秒钟buffer的大小。 //建立AudioTrack视频
AudioTrack trackplayer = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_ STEREO, AudioFormat.ENCODING_PCM_16BIT, bufsize,blog
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的使用就讲完了。
就这么简单。
以上就是本文的所有内容,但愿对你们的学习有所帮助,也但愿你们多多支持脚本之家。