Android audio 二 AudioRecord 分析上
Android audio 三 AudioRecord 分析下
Android audio 四 AudioTrack 分析上
Android audio 五 AudioTrack 分析下
Android audio 六 AudioRecord AudiTrack 拾音放音例子
Android 播放音频类 AudioTrack
文件:
frameworks/base/media/java/android/media/AudioTrack.java
frameworks/base/core/jni/android_media_AudioTrack.cpp
frameworks/av/media/libmedia/AudioTrack.cpp
AudioTrack 只能播放 pcm 格式的音频,实现 AudioTrack 播放音频的步骤:
- 获取基本参数(如声道,采样率, 音频缓存大小等 )
- 根据第一步获取的基本参数,创建AudioTrack对象
- 获取PCM文件,写入 AudioTrack
- 开始播放
- 停止并释放 AudioTrack
例如:
// 第一步 获取基本参数
int bufferSize = 1920;
int rate = 48000;
// 第二步 根据第一步获取的基本参数,创建AudioTrack对象
private AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
rate,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize,
AudioTrack.MODE_STREAM);
// 第三步 获取 PCM 文件,写入 AudioTrack
byte[] bytes;
bufferSize = XxxPcmRead(pcm,bytes,bufferSize);
// 第四步 开始播放
audioTrack.write(bytes, 0, bytes.length);
audioTrack.play();
// 第五步 停止并释放 AudioTrack
audioRecord.stop();
audioRecord.release();
audioRecord = null;
从创建 AudioTrack 开始分析:
先来看看 AudioTrack 构造函数:
在创建 AudioTrack 的时候,传入音频流类型, 采样率 ,音频通道数,buffer 长度等参数。
public AudioTrack(int streamType, int sampleRateInHz, int channelConfig, int audioFormat,
int bufferSizeInBytes, int mode, int sessionId)
throws IllegalArgumentException {
// mState already == STATE_UNINITIALIZED
this((new AudioAttributes.Builder())
.setLegacyStreamType(streamType)
.build(),
(new AudioFormat.Builder())
.setChannelMask(channelConfig)
.setEncoding(audioFormat)
.setSampleRate(sampleRateInHz)
.build(),
bufferSizeInBytes,
mode, sessionId);
}
在看看 write 调用的 audiotrack 内部实现的另一个 write 方法
public int write(@NonNull byte[] audioData, int offsetInBytes, int sizeInBytes) {
return write(audioData, offsetInBytes, sizeInBytes, WRITE_BLOCKING);
}
接下来看看 play(), play 调用本地方法 native_start();
public void play()
throws IllegalStateException {
if (mState != STATE_INITIALIZED) {
throw new IllegalStateException("play() called on uninitialized AudioTrack.");
}
baseStart();
synchronized(mPlayStateLock) {
native_start();
mPlayState = PLAYSTATE_PLAYING;
}
}
Android 中 AudioTrack 的 java层业务是调用本地 native 层的 c/cpp 代码实现。
同分析 audiorecord 类似, 我们进入 native 找到 AudioTrack 的本地实现 AudioTrack.cpp 。