这篇文章上次修改于 1722 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

AudioTrack 相较于 MediaPlayer ,更贴近于底层,使用它需要手动设置音频的声道,采样等,AudioTrack 只支持播放 PCM 数据。

public AudioTrack (AudioAttributes attributes, 
                AudioFormat format, 
                int bufferSizeInBytes, 
                int mode, 
                int sessionId)
Parameters
attributesAudioAttributes: AudioAttributes 实例,不能为空
formatAudioFormat: 用于描述播放的数据格式,AudioFormat 中包含了编码
格式,声道和采样率等,不能为空
bufferSizeInBytesint: 用于读取音频数据的内部缓冲区的总大小(以byte为单位)。
如果 modeMODE_STATIC ,其为音频最大长度;
如果是 MODE_STREAM ,其值要大于等于接收流的最小缓冲区大小,建议
使用 getMinBufferSize(int, int, int) 方法来估算 AudioTrack的
实例在流模式下的最小缓冲区大小
modeint: 模式二选一 MODE_STATICMODE_STREAM
sessionIdint: 音频会话ID,用于将音效与播放器(AudioTrack,MediaPlayer等)
关联起来,创建一个新的ID,请使用
AudioManager#generateAudioSessionId()

AudioAttributes

封装描述音频流信息的属性集合的类,但是它没有 public 的构造方法,需要使用AudioAttributes.Builder() 来构造它,

new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).build();

setUsage 设置 AudioTrack 的使用场景;

setContentType 设置输入的音频文件内容的类型;

除了以上两个常用的方法,AudioAttributes.Builder() 还有一些其他方法


AudioFormat

是包含了声道信息,编码格式以及采样率的常量。同样,它也需要使用 Builder() 的方法构造,其中需要说明的是 setChannelIndexMask(int channelIndexMask)setChannelMask(int channelMask) 都是设置声道,前者使用索引,后者使用 AudioFormat 的常量,例如 AudioFormat#CHANNEL_OUT_FRONT_LEFT ,二者设置其一就可以,代码在 build() 时,优先使用前者设置的数据。

getMinBufferSize

public static int getMinBufferSize (int sampleRateInHz, 
                int channelConfig, 
                int audioFormat)
Parameters
sampleRateInHzint: 采样率,单位为 Hz
channelConfigint: 描述音频的声道,单声道或立体声及
AudioFormat#CHANNEL_OUT_MONOAudioFormat#CHANNEL_OUT_STEREO
audioFormatint: 音频数据表示格式,由于 AudioTrack 只接收 PCM 数据,所以
格式的可选项只有:
AudioFormat#ENCODING_PCM_16BITAudioFormat#ENCODING_PCM_8BIT
以及AudioFormat#ENCODING_PCM_FLOAT
返回值
int返回在MODE_STREAM模式下创建AudioTrack对象所需的最小缓冲区大小,这是一个
估计值。