这篇文章上次修改于 1788 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
AudioTrack
相较于 MediaPlayer
,更贴近于底层,使用它需要手动设置音频的声道,采样等,AudioTrack
只支持播放 PCM
数据。
public AudioTrack (AudioAttributes attributes,
AudioFormat format,
int bufferSizeInBytes,
int mode,
int sessionId)
Parameters | |
---|---|
attributes | AudioAttributes : AudioAttributes 实例,不能为空 |
format | AudioFormat : 用于描述播放的数据格式,AudioFormat 中包含了编码格式,声道和采样率等,不能为空 |
bufferSizeInBytes | int : 用于读取音频数据的内部缓冲区的总大小(以byte为单位)。如果 mode 是 MODE_STATIC ,其为音频最大长度;如果是 MODE_STREAM ,其值要大于等于接收流的最小缓冲区大小,建议使用 getMinBufferSize(int, int, int) 方法来估算 AudioTrack的实例在流模式下的最小缓冲区大小 |
mode | int : 模式二选一 MODE_STATIC 与 MODE_STREAM |
sessionId | int : 音频会话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 | |
---|---|
sampleRateInHz | int : 采样率,单位为 Hz |
channelConfig | int : 描述音频的声道,单声道或立体声及AudioFormat#CHANNEL_OUT_MONO 或AudioFormat#CHANNEL_OUT_STEREO |
audioFormat | int : 音频数据表示格式,由于 AudioTrack 只接收 PCM 数据,所以格式的可选项只有: AudioFormat#ENCODING_PCM_16BIT 和 AudioFormat#ENCODING_PCM_8BIT 以及 AudioFormat#ENCODING_PCM_FLOAT |
返回值 | |
---|---|
int | 返回在MODE_STREAM模式下创建AudioTrack对象所需的最小缓冲区大小,这是一个 估计值。 |
没有评论