Android audio 一 源码路径
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_UNINITIALIZEDthis((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 。