AudioTrack是管理和播放单一音频资源的类。它用于PCM音频流的回放。实现方式是通过write(byte[], int, int)、write(short[], int, int)、write(float[], int, int, int)把数据push到AudioTrack对象。
一个AudioTrack可以在两种模式下运行:static 和 streaming。Streaming模式下,应用通过调用write方法把连续的流写入到AudioTrack。音频文件过大、采样率过高或即时产生的数据可以采用这种模式。static适合处理短的声音,例如UI和游戏的声音。
初始化AudioTrack实例的时候,需要关联一个buffer(一个byte数组)并需要指定buffer的大小,buffer可以决定AudioTrack可以播放多长的数据。如果是static模式,buffer的大小可以是声音的大小。如果是streaming模式,写入到AudioTrack的数据大小应该小于或等于buffer的大小。
AudioTrack可以被继承,但是不建议这么做。
AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,int bufferSizeInBytes, int mode,int sessionId)
*****streamType 音频流的类型,主要有以下几种
1.AudioManager.STREAM_VOICE_CALL 用于电话通话的音频流
2.AudioManager.STREAM_SYSTEM 用于系统声音的音频流
3.AudioManager.STREAM_RING 用于电话铃声的音频流
4.AudioManager.STREAM_MUSIC 用于音乐播放的音频流
5.AudioManager.STREAM_ALARM 用于警报的音频流
6.AudioManager.STREAM_NOTIFICATION 用于通知的音频流
7.AudioManager.STREAM_BLUETOOTH_SCO 用于连接到蓝牙电话时的手机音频流
8.AudioManager.STREAM_SYSTEM_ENFORCED 在某些国家实施的系统声音的音频流
9.AudioManager.STREAM_DTMF DTMF音调的音频流
10.AudioManager.STREAM_TTS 文本到语音转换(TTS)的音频流
开发者可用的有1、2、3、4、5、6
*****sampleRateInHz 初始源的采样率,用赫兹表示。
*****channelConfig 音频通道配置 目前只支持AudioFormat.CHANNEL_OUT_MONO(单体)和AudioFormat#CHANNEL_OUT_STEREO(立体)两种
*****audioFormat 表示音频数据的格式。AudioFormat.ENCODING_PCM_16BIT、AudioFormat.ENCODING_PCM_8BIT、AudioFormat.ENCODING_PCM_FLOAT
*****bufferSizeInBytes buffer缓冲区的大小
*****mode 模式 static和stream两种
*****sessionId 音频会话ID,给AudioTrack关联一个音频效果 。创建AudioEffect会设置一个sessionId。AudioEffect会作用于具有相同sessionId的AudioTrack和MeidaPlayer。
Looper looper;
if ((looper = Looper.myLooper()) == null) {
looper = Looper.getMainLooper();
}
mInitializationLooper = looper;
在构造函数中,会将当前的Looper赋值给mInitializationLooper,在后边初始化Handler的时候会用到。
Tip:如何判断当前线程是不是主线程,可以通过比较Looper.myLooper()和Looper.getMainLooper()是否相等。
IBinder b = ServiceManager.getService(Context.APP_OPS_SERVICE);
mAppOps = IAppOpsService.Stub.asInterface(b);
获取IAppOpsService binder接口。
通过native_setup方法进行初始化。
if (mDataLoadMode == MODE_STATIC) {
mState = STATE_NO_STATIC_DATA;
} else {
mState = STATE_INITIALIZED;
}
初始化以后,根据模式来设置AudioTrack实例的状态。开发人员在播放音频前可以根据这个状态查看AudioTrack是否可用。
构建AudioTrack也可以通过Builder模式。例如:
AudioTrack player = new AudioTrack.Builder()
.setAudioAttributes(new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.setContentType(CONTENT_TYPE_MUSIC)
.build())
.setAudioFormat(new AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_16BIT)
.setSampleRate(441000)
.setChannelMask(AudioFormat.CHANNEL_OUT_STEREO)
.build())
.setBufferSize(minBuffSize)
.build();
返回最小的缓冲区大小,适用于STREAM模式。
sampleRateInHz 采样率,范围在4000-192000之间,AudioRecord类中建议此值为44100,这个值可以保证在所有设备上工作。22050、16000、11025只在某些设备上起作用。最后会调用本地方法native_get_min_buff_size返回大小。
static public int getMinBufferSize(int sampleRateInHz, int channelConfig, int audioFormat)
开始播放
public void play()throws IllegalStateException{}
停止播放音频数据,如果是STREAM模式,会等播放完最后写入buffer的数据才会停止。如果立即停止,要调用pause()方法,然后调用flush方法,会舍弃还没有播放的数据
public void stop()throws IllegalStateException{}
暂停播放,调用play()重新开始播放
public void pause()throws IllegalStateException {}
只在模式为STREAM下可用。
将音频数据刷进等待播放的队列,任何写入的数据如果没有提交的话,都会被舍弃,但是并不能保证所有用于数据的缓冲空间都可用于后续的写入。
public void flush() {
释放本地AudioTrack资源
public void release()
返回当前的播放状态
public int getPlayState()
声道:声道(Sound Channel) 是指声音在录制或播放时在不同空间位置采集或回放的相互独立的音频信号,所以声道数也就是声音录制时的音源数量或回放时相应的扬声器数量。
声卡所支持的声道数是衡量声卡档次的重要指标之一,从单声道到最新的环绕立体声。